HTTPに新メソッド「QUERY」登場、GET・POSTとの違いを高校生にもわかるように解説(RFC 10008)

概要

本記事ではHTTPに新しく追加されたメソッド「QUERY」について説明します。

WebのAPIというとGETPOSTの2つだけでなんとかしている人が多いと思いますが、実はこの2つだけだと困る場面があります。
2026年6月、IETF(インターネットの技術仕様を決めている団体)がその困りごとを解決する新しいメソッド「QUERY」をRFC 10008として標準化しました。

GETの「安全さ」とPOSTの「本文を送れる自由さ」を両方いいとこ取りしたメソッドだとイメージしてもらえればOKです。
専門用語もできるだけ噛み砕きながら、具体例を交えて解説していきます。

それではやっていきましょう!

目次

GET・POSTってそもそも何?(おさらい)

QUERYの話に入る前に、まずGETとPOSTのおさらいをしておきます。

GET=はがき

GETは、よく「はがき」にたとえられます。

はがきは表に宛先と一緒に用件を書きますよね。
GETも同じで、送りたい情報(検索キーワードなど)を全部URLの中に書き込みます。
https://example.com/search?keyword=猫?keyword=猫 の部分がまさにそれです。

はがきは誰でも中身が見えてしまいますが、その代わり何度送っても中身が変わらないという安心感があります。
この性質のことを、HTTPの世界では次の2つの言葉で呼びます。

  • 安全(safe)
    • サーバー側の状態(データベースの中身など)を変更しない
  • べき等(idempotent)
    • 同じリクエストを何回送っても、結果が同じになる

GETはこの「安全」と「べき等」を両方満たしているので、ブラウザが自動で再送信したり、一度取得した結果をキャッシュ(一時保存)して使い回したりできます
通信が不安定でリクエストが届いたか怪しいときも、GETなら気にせずもう一度送れるわけですね。

ただしGETには弱点があって、送れる情報の長さがURLの制限に引っかかりやすいという問題があります。
検索条件がたくさんある複雑な検索フォームだと、URLがとても長くなってしまい、ブラウザやサーバーの上限を超えてエラーになることもあります。

POST=封筒に入った手紙

一方POSTは「封筒に入った手紙」にたとえられます。

封筒の中(リクエストボディ、本文)に好きなだけ内容を詰め込めるので、GETのような長さの制限をほぼ気にしなくて済みます。
だから複雑な検索条件を送りたいとき、開発者は本来「データを新しく登録する」ためのPOSTを、検索用に流用することがよくありました。

ただしPOSTには「安全」でも「べき等」でもないという弱点があります。
POSTは本来「注文を確定する」「コメントを投稿する」のようにサーバー側の状態を変えるための仕組みなので、ブラウザは「もう一度送ると二重注文になるかもしれない」と考えて、勝手に再送信やキャッシュをしてくれません。

検索したいだけなのに、注文用の封筒を使って送っているようなちぐはぐな状態だったわけです(- -;

新メソッド「QUERY」の登場(RFC 10008)

この「GETは短い情報しか送れない」「POSTは検索に使うと安全・べき等の恩恵がない」というモヤモヤを解消するために生まれたのが、今回のQUERYメソッドです。

QUERYを一言でいうと、「封筒(本文)を使えるはがき」です。

  • POSTのように本文(リクエストボディ)を送れる
    • URLの長さを気にせず、複雑な検索条件や大量のID一覧を送信できる
  • GETのように安全・べき等
    • サーバーの状態を変えないので、ブラウザやプロキシが自動で再送信・キャッシュしてよい

下の図は、GET・POST・QUERYの3つを「安全性」「べき等性」の観点で並べたものです。

GET・POST・QUERYの違い(安全性・べき等性・本文の有無で比較)
GET・POST・QUERYの違いを比較した図。GETははがきタイプで安全かつべき等だが本文なし、POSTは封筒タイプだが安全でもべき等でもない、QUERYは封筒タイプで安全かつべき等

文字だけでも比較できるように、表にもまとめておきます。

メソッド 安全(safe) べき等(idempotent) 本文を送れるか
GET ×
POST × ×
QUERY

QUERYの具体的な使い方

実際にQUERYメソッドをリクエストする例を見てみます。
curl コマンドで書くと、次のような形になります。

QUERYリクエストの例

1
2
3
curl -X QUERY 'https://example.com/contacts' \
-H 'Content-Type: application/json' \
-d '{"filter": {"city": "Tokyo"}, "limit": 50}'

やっていることはPOSTとほぼ同じで、-X QUERY の部分でメソッド名を指定し、-d の後ろにJSON形式の検索条件を本文として送っているだけです。
「東京在住の連絡先を、最大50件まで検索してください」というリクエストになります。

サーバー側からは、次のようなレスポンスが返ってくるイメージです。

レスポンス例

1
2
3
4
{
"query": { "filter": { "city": "Tokyo" }, "limit": 50 },
"results": []
}

見た目はPOSTとほとんど変わらないので「じゃあ何が嬉しいの?」と思うかもしれませんが、嬉しいのはリクエストの書き方ではなく、ブラウザやサーバー、キャッシュサーバーがこのリクエストをどう扱ってくれるかという部分です。

RFC 10008では、サーバーが対応しているクエリの書式(JSONPathやSQLなど)をAccept-Queryという新しいレスポンスヘッダーで教えられる仕組みも定義されています。
またContent-Typeが本文の内容と食い違っている場合、サーバーはリクエストを失敗させなければならない、というルールも決められています。

QUERYを使うメリット

ここまでの内容を踏まえて、QUERYを使うメリットを整理します。

  • キャッシュが効く
    • 同じ検索条件のリクエストなら、キャッシュサーバーが結果を覚えておいて使い回せる
  • 自動リトライしても安全
    • 通信エラーで届いたか怪しいときも、二重処理の心配なくもう一度送れる
  • URLに収まらない複雑な条件を送れる
    • 長いフィルター条件や大量のID一覧を、POSTと同じ感覚で本文に詰め込める
  • 「検索している」という意図がはっきりする
    • メソッド名を見るだけで、状態を変えない読み取り専用の処理だとわかる

「安全なPOST」あるいは「本文を持てるGET」だと覚えておけば十分です。

今のところの注意点

QUERYはまだ生まれたばかりのメソッドなので、使う前に知っておきたい注意点もあります。

2026年8月時点では、主要なブラウザのFetch APIやHTMLの<form>要素はQUERYに対応していません。
サーバー側もNode.jsやGoなど一部の環境から対応が始まった段階で、実際にプロダクトへ採用するにはまだしばらく様子見が必要な状況です。

ちなみに、対応していない中継サーバーやプロキシがあった場合に備えて、QUERYからGETへ自動的に切り替えるフォールバックの仕組みも仕様に含まれているようです。

とはいえ実務で使うかどうかは、自分が触っているフレームワークやライブラリの対応状況を見てから判断するのがよさそうです。

標準化トラックのRFCとして正式に定義されているので、対応が広がるのを待つ形で気長に構えておくのがよさそうです。

まとめ

いかがでしたか?

検索がやりやすくなって良いメソッドですよね!
ただ万能ではないので、getもpostもしっかり使い分けしていきましょう(^^

以上となります。
エンジニアとしては嬉しい追加機能!ありがたい!!
それではお疲れさまでした。