GETの限界とQUERYの必然性
我々エンジニアがAPI設計を行う際、長年抱えてきた「呪い」のような制約がある。それは、複雑な検索条件をクライアントからサーバーへ送る際、GETメソッドのURLパラメータに依存せざるを得ないという現実だ。URLには文字数制限があり、ログには機密情報が平文で残り、ネストされたJSON構造を表現しようとすればエンコードの嵐で可読性は地に落ちる。かといってPOSTを使えば、キャッシュは効かず、冪等性(Idempotency)も保証されないため、ネットワーク障害時のリトライ処理でサーバーサイドに予期せぬ副作用を及ぼすリスクを常に背負うことになる。
この「GETの制約」と「POSTの副作用」という二律背反に、ついに終止符が打たれた。2026年6月にIETFが公開したRFC 10008は、実に16年ぶりとなる新しいHTTPメソッド「QUERY」を定義した。これは単なる仕様の追加ではない。HTTPというプロトコルが、現代の複雑なデータ構造を扱うための「読み取り専用の強力な手段」を正式に獲得したことを意味する。QUERYメソッドは、POSTのようにリクエストボディを許容しながら、GETが持つ「安全(Safe)」かつ「冪等(Idempotent)」というセマンティクスを継承している。これにより、キャッシュサーバーやプロキシは、リクエストボディの内容をキャッシュキーに含めることで、安全にレスポンスを再利用できるようになった。
現場のエンジニアにとって、これは「ハック」からの解放を意味する。これまで我々は、GraphQLやElasticsearchのクエリをPOSTで無理やりトンネリングさせたり、CloudflareのようなCDNでPOSTリクエストをキャッシュさせるために「偽のGETリクエスト」を生成するという、お世辞にも美しいとは言えない回避策を講じてきた。RFC 10008は、こうしたスパゲッティ化した設計を標準化されたクリーンなアーキテクチャへと昇華させるための、極めて重要なピースなのである。
なぜ「GETにボディを持たせる」ではダメなのか
コミュニティの一部では「なぜわざわざ新しいメソッドを作るのか?GETにオプションでボディを持たせれば済む話ではないか」という議論が絶えない。RedditやHacker Newsでも同様の議論が白熱したが、この問いに対する答えは、分散システムにおける「デバッグの容易性」と「プロトコルの堅牢性」という観点から極めて明確である。もしGETにボディを持たせるという「ハック」を許容した場合、そのリクエストを解釈できない古いプロキシやロードバランサーが、ボディを無視してリクエストを転送したり、最悪の場合は接続を強制切断したりする事態が頻発するだろう。これは、深夜の障害対応において最も避けるべき「原因不明のパケット消失」を誘発する。
RFC 10008がQUERYメソッドを新設した最大の理由は、サーバー側がその機能をサポートしているかどうかを明示的にハンドリングできる点にある。QUERYメソッドをサポートしていないサーバーは、当然ながら「405 Method Not Allowed」を返す。これにより、クライアント側は「サーバーがこのクエリ形式を理解できない」という事実を即座に検知できる。これは、サイレントに失敗するGETボディのハックとは比較にならないほど、運用上のコストを低減させる設計思想だ。
現在、Rustのhttp crateをはじめ、.NET、Axum、Quarkus、Brunoといった主要なツールチェーンがQUERYメソッドへの対応を進めている。これは、単なる仕様策定の段階を超え、実務レベルでの実装フェーズに移行していることを示唆している。以下の表は、HTTPメソッドの特性を比較したものである。
| メソッド | ボディの許容 | 安全(Safe) | 冪等(Idempotent) | 主な用途 |
|---|---|---|---|---|
| GET | 不可(非推奨) | Yes | Yes | リソース取得 |
| POST | Yes | No | No | リソース作成・状態変更 |
| QUERY | Yes | Yes | Yes | 複雑な条件でのリソース取得 |
この表を見れば一目瞭然だが、QUERYは「POSTの表現力」と「GETの安全性」を両立させた、まさに現代のWeb APIにおける「最適解」である。我々エンジニアは、この新しい標準を単なる知識として蓄えるのではなく、既存のAPI設計をリファクタリングする際の強力な武器として認識すべきだ。
標準化の先にあるエンジニアの責務
RFC 10008の登場は、Web開発の歴史において一つの到達点であると同時に、我々に対する新たな問いかけでもある。HTTPというプロトコルは、16年ぶりの新メソッド追加という事実が示す通り、極めて保守的で慎重に進化してきた。PATCHメソッドが普及するまでに要した年月を考えれば、QUERYメソッドがインターネットの隅々まで行き渡り、あらゆるCDNやプロキシでキャッシュが正しく機能するようになるまでには、さらに数年の歳月が必要になるだろう。我々エンジニアは、この「過渡期」をどう生き抜くべきか。
明日から取るべき具体的な対策は、まず自社のAPIゲートウェイやロードバランサーがQUERYメソッドを透過的に扱えるか、あるいは拒否する設定になっているかを検証することだ。もし拒否されているのであれば、将来的な移行を見据えて設定のアップデートを検討する必要がある。また、現在POSTで実装している複雑な検索エンドポイントを、QUERYメソッドへ段階的に移行するためのロードマップを策定することも重要だ。ただし、これは単なる置換作業ではない。キャッシュ戦略を再設計し、リクエストボディの構造がキャッシュキーとして適切に機能するかを検証する、高度なアーキテクチャ設計が求められる。
ここで我々が直面する真の課題は、「標準化された技術を、いかにしてレガシーな環境と共存させながら導入するか」という点にある。新しい技術が出たからといって、既存の安定したシステムを破壊してまで導入するのは愚策だ。しかし、技術的負債を放置し、いつまでも「GETのボディハック」を使い続けることは、将来のエンジニアに対する背信行為ではないだろうか。QUERYメソッドの採用は、単なるコードの書き換えではなく、Webという巨大な分散システムに対する我々の「誠実さ」を問う試金石となるはずだ。あなたは、この新しい標準を自身のシステムにどう組み込み、次世代のAPI設計へと繋げていくのか。その答えは、あなたの書くコードと、その先にあるシステムの堅牢性にのみ宿るのである。


コメント