メインコンテンツへスキップ

Go Proposal Weekly Digest

Go言語のproposal更新を毎週お届け

#80058active

net/http: add MethodQuery constant

新規提案

要約

AIによる要約であり、誤りを含む場合があります。

概要

HTTP QUERYメソッド(RFC 10008)に対応するhttp.MethodQuery定数をnet/httpパッケージに追加する提案です。既存のMethodGetMethodPatchと同じパターンを踏襲します。

ステータス変更

(新規)active
2026年7月22日のproposal review meetingで議論され、翌日(7月23日)に@aclementsによりactiveカラムへ追加されました。今後は毎週のproposal reviewミーティングで継続的に審議される段階に入ります。この提案自体は「妥当(reasonable)」との評価を@neildから早い段階で得ていたものの、"どこで新メソッド追加の線引きをするか"という一般論的な論点が浮上したため、即決ではなく通常の審議プロセスに乗せる扱いとなりました。

技術的背景

現状の問題点

GETとPOSTの間には、「安全(safe)かつ冪等(idempotent)だが、複雑なクエリ条件や大きなリクエストボディ、バイナリボディを送りたい」というユースケースの隙間がありました。GETはURLにクエリパラメータを埋め込む必要があり長さや構造に制約がある一方、POSTは安全でも冪等でもないためキャッシュや再試行の扱いが難しいという問題があります。
このギャップを埋めるためにIETFで標準化が進められ、当初は"SEARCH"という名称で提案されていました(Go側でも過去に#29894として同様の提案があり、rscにより「net/httpのクライアントAPIを全面刷新するまでは変更を見送る」として一旦クローズされています)。その後、標準化過程でメソッド名は"QUERY"に改名され、RFC 10008として正式に公開されました。

提案された解決策

net/http/method.goに、既存のMethodPatch(RFC 5789)などと同様のパターンで以下のような定数を追加します。

const (
    MethodQuery = "QUERY"
)

これにより、HTTP QUERYメソッドを使ったリクエストを組み立てる際に、他のHTTPメソッドと同様に定数として参照できるようになります。なお、Content-Lengthの扱いやリダイレクト時の挙動といった意味論的な詳細調整については、必要であれば別issueで扱うこととされています。

これによって何ができるようになるか

RFC 10008に準拠したQUERYメソッドを使うAPI(例えばgRPC-Gatewayなどを介したAPI)を実装・利用する開発者が、他の標準メソッドと同じ感覚でGoの標準ライブラリのみでリクエストを構築できるようになります。OpenAPI 3.2でもQUERYメソッドが明示的にサポートされ始めており、今後採用が広がることが見込まれます。

コード例

// Before: 文字列リテラルを直接指定する必要がある
req, err := http.NewRequest("QUERY", url, body)
// After: 他のメソッドと同様に定数を利用できる
req, err := http.NewRequest(http.MethodQuery, url, body)

議論のハイライト

  • 定数の追加基準(線引き)が主要な論点に: @aclementsは「RFCがある」「IANAレジストリに載っている」だけでは基準として不十分(IANAレジストリの大半はWebDAV固有のメソッドなど)と指摘し、MDNのHTTPメソッド一覧(現状net/httpの定数と完全一致)が妥当な基準になり得ると述べています。@neildはさらに、「特定のサブプロトコルに限定されず、最新のHTTP RFC(現行はRFC 9110)に記載されているか、あるいはより新しいhttpbis RFCで一定以上のステータスを持つもの」という、より原則的な基準案を提示しました。
  • 定数そのものの是非を巡る議論: @neildは個人的な意見として「文字列リテラルを直書きする方が明確で検索しやすい」と述べましたが、@mxeyが「では既存の定数群を非推奨にすべきか」と問うと、@neildは「自分の好みのためだけにエコシステムに大きな混乱をもたらすことになる」として否定しています。
  • 既存の慣習との整合性: @EyJunge1や@willfaughtは、「v1のnet/httpは既にすべてのRFC標準メソッドに定数を用意するという方針を過去に決定している」ため、QUERYだけを除外すると逆に『まだサポートされていないのか』という誤解を招く、と指摘し、既存パターンを踏襲することの妥当性を主張しました。
  • 大文字小文字の区別への言及: @jub0bsは、HTTPメソッド名は大文字小文字を区別する(RFC 9110)ため、将来的なnet/http v2ではMethodGETのように定数名にケースを反映させるべきという意見を述べましたが、これは今回のproposalの直接のスコープ外として扱われています。
  • 前身提案との関係: かつて同じ機能を"SEARCH"という名称で提案していた#29894は、メソッド名がQUERYに改名されたことを受けて本proposal(#80058)に置き換えられる形でクローズが提案されています。

関連リンク