2026年6月に追加された新しいHTTPメソッドです。
RFC 10008: The HTTP QUERY MethodThis specification defines the QUERY method for HTTP. A QUERY requests that the request target process the enclosed content in a safe and idempotent manner and then respond with the result of that processing. This is similar to POST requests, but QUERY requests can be automatically repeated or restarted without concern for partial state changes.GETのように安全かつ冪等でありながら、POSTのようにリクエストボディを持つことができるHTTPメソッドです。
比較
RFC10008でGET,QUERY,POSTの3つのHTTPメソッドが比較されています。
| 項目 | GET | QUERY | POST |
|---|---|---|---|
| 安全 | はい | はい | いいえ |
| 冪等 | はい | はい | いいえ |
| クエリ自体のURI | はい(定義上) | オプション(位置情報応答フィールド) | いいえ |
| クエリ結果のURI | オプション(Content-Locationレスポンスフィールド) | オプション(Content-Locationレスポンスフィールド) | オプション(Content-Locationレスポンスフィールド) |
| キャッシュ可能 | はい | はい | はい、ただし今後のGETまたはHEADリクエストに限ります。 |
| コンテンツ(ボディ) | 「意味が定義されていない」 | 期待される結果(対象リソースごとの意味論) | 期待される結果(対象リソースごとの意味論) |
上の表から、下記のようなことがわかります。
QUERYは、GETと同じく安全かつ冪等である。QUERYは、POSTと同じくリクエストボディを持つことができる。QUERYは、GETと同じくキャッシュ可能である。
使いどころ
QUERYメソッドは、GETと同じく安全かつ冪等であり、POSTと同じくリクエストボディを持つことができるため、検索やフィルタリングなどのクエリ操作に適しています。
なぜGETやPOSTではなくQUERYなのか
例えば
/search?hoge=hogehoge&fuga=fugafuga&...
のように、検索キーワードをクエリパラメータとしてURLに含める場合、URLの長さ制限に引っかかる可能性があったり、URIに含まれる情報がログに残ってしまうなどの問題があります。また、ネストされた検索条件を表現しづらいという問題もあります。
GETでリクエストボディを持たせることは技術的には可能ですが、リクエストが失敗したり、拒否されたりしてしまうため、RFC7231でもGETメソッドにリクエストボディを持たせることは推奨しないと明記されています。
上記の対応として、POSTメソッドを使うこともできますが、状態を変更するリクエストではないため、POSTメソッドを使うのは適切ではありません。
また、POSTメソッドだと、キャッシュが効かないため、検索結果のキャッシュを有効にしたい場合には不向きという問題もあります。
検証
前提条件
- Node.js v26.5.1
- Bun v1.4.0
- Hono v4.13.5
v4.13.0から、HonoでQUERYメソッドを使えるようになっていることは確認済みです。
サーバー側
デフォルト生成のsrc/index.tsを以下のように編集します。
import { Hono } from 'hono'
const app = new Hono()
app.query('/search', async (c) => {
const query = c.req.query()
const body = await c.req.json()
return c.json({ query, body })
})
fire(app);c.req.query()だけでなくc.req.json()でリクエストボディも読み取り、レスポンスに含めています。これによって、QUERYメソッドがGETのようにクエリパラメータを扱いつつ、POSTのようにリクエストボディも持てることを確認できます。
クライアント側
curlでQUERYメソッドを指定し、リクエストボディを付けてリクエストを送ります。
curl -X QUERY 'http://localhost:3000/search?hoge=hogehoge' \
-H 'Content-Type: application/json' \
-d '{"fuga":"fugafuga"}'実行すると、以下のようにクエリパラメータとリクエストボディの両方がレスポンスに含まれていることが確認できました。
{
"query": { "hoge": "hogehoge" },
"body": { "fuga": "fugafuga" }
}これによって、QUERYメソッドがGETのようにクエリパラメータを扱いつつPOSTのようにリクエストボディを持てるという、比較表で挙げた特徴を確認することができました。
まとめ
正式な策定からまだ日が浅く、すべてのフレームワーク・ライブラリがQUERYメソッドをサポートしているわけではないので、しばらく静観の必要がありそうですが、今後の検索やフィルタリングなどのクエリ操作においては、QUERYメソッドを採用することになりそうです。
理解度チェック(AI生成)
以下の4択問題で、QUERYメソッドの理解度をチェックしてみましょう。答えは折りたたまれているので、クリックして確認してください。
Q1. QUERYメソッドの性質として正しいものはどれか?
- GETと同じく安全かつ冪等である
- POSTと同じく安全でも冪等でもない
- 安全だが冪等ではない
- 冪等だが安全ではない
答えを見る
正解: 1. GETと同じく安全かつ冪等である RFC10008の比較表にある通り、QUERYはGETと同じく「安全」かつ「冪等」なメソッドです。
Q2. QUERYメソッドがPOSTメソッドと共通して持つ特徴はどれか?
- 状態を変更できる点
- リクエストボディを持てる点
- キャッシュ不可な点
- 冪等ではない点
答えを見る
正解: 2. リクエストボディを持てる点 QUERYはGETのように安全・冪等でありながら、POSTのようにリクエストボディを持つことができるメソッドです。
Q3. GETメソッドにリクエストボディを持たせることについて、RFC7231ではどのように記載されているか?
- 積極的に推奨されている
- 明確に禁止されている
- 推奨されないと明記されている
- QUERYメソッドの登場によって非推奨ではなくなった
答えを見る
正解: 3. 推奨されないと明記されている GETリクエストのペイロードには定義された意味がなく、実装によってはリクエストが拒否される可能性があるため、RFC7231ではGETにリクエストボディを持たせることは推奨されないと明記されています。
Q4. 検索・フィルタリング処理にPOSTメソッドを使うことが不向きとされる理由として、記事で挙げられているものはどれか?
- リクエストボディを持てないから
- 状態を変更するリクエストではないのにPOSTを使うのは適切ではなく、またキャッシュも効かないから
- URLの長さ制限に引っかかるから
- RFC10008でPOSTの使用が禁止されているから
答えを見る
正解: 2. 状態を変更するリクエストではないのにPOSTを使うのは適切ではなく、またキャッシュも効かないから POSTは安全でも冪等でもないメソッドであり、状態を変更しない検索処理に使うのは適切ではありません。加えてキャッシュが効かない点も検索結果のキャッシュ活用には不向きです。
Q5. 記事の検証で使われたHonoのバージョンについて、正しい記述はどれか?
- v4.13.0からQUERYメソッドが使えるようになった
- QUERYメソッドはHonoの初期バージョンから使えていた
- QUERYメソッドはHonoではまだサポートされていない
- QUERYメソッドを使うには別途プラグインのインストールが必要
答えを見る
正解: 1. v4.13.0からQUERYメソッドが使えるようになった 記事内のHono v4.13.0のリリースノートへのリンクにある通り、このバージョンからHonoで
app.query()としてQUERYメソッドが使えるようになっています。