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.IETF Datatracker

GETのように安全かつ冪等でありながら、POSTのようにリクエストボディを持つことができるHTTPメソッドです。

比較

RFC10008でGET,QUERY,POSTの3つのHTTPメソッドが比較されています。

項目GETQUERYPOST
安全はいはいいいえ
冪等はいはいいいえ
クエリ自体の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メソッドを使えるようになっていることは確認済みです。

Release v4.13.0 · honojs/honoHono v4.13.0 is now available! The highlight of this release is performance: a batch of low-level optimizations makes the core request/response path significantly faster — up to 1.25x on common rou...GitHub

サーバー側

デフォルト生成の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メソッドの性質として正しいものはどれか?

  1. GETと同じく安全かつ冪等である
  2. POSTと同じく安全でも冪等でもない
  3. 安全だが冪等ではない
  4. 冪等だが安全ではない

Q2. QUERYメソッドがPOSTメソッドと共通して持つ特徴はどれか?

  1. 状態を変更できる点
  2. リクエストボディを持てる点
  3. キャッシュ不可な点
  4. 冪等ではない点

Q3. GETメソッドにリクエストボディを持たせることについて、RFC7231ではどのように記載されているか?

  1. 積極的に推奨されている
  2. 明確に禁止されている
  3. 推奨されないと明記されている
  4. QUERYメソッドの登場によって非推奨ではなくなった

Q4. 検索・フィルタリング処理にPOSTメソッドを使うことが不向きとされる理由として、記事で挙げられているものはどれか?

  1. リクエストボディを持てないから
  2. 状態を変更するリクエストではないのにPOSTを使うのは適切ではなく、またキャッシュも効かないから
  3. URLの長さ制限に引っかかるから
  4. RFC10008でPOSTの使用が禁止されているから

Q5. 記事の検証で使われたHonoのバージョンについて、正しい記述はどれか?

  1. v4.13.0からQUERYメソッドが使えるようになった
  2. QUERYメソッドはHonoの初期バージョンから使えていた
  3. QUERYメソッドはHonoではまだサポートされていない
  4. QUERYメソッドを使うには別途プラグインのインストールが必要