| RFC 10008 | HTTP QUERY メソッド | 2026年6月 |
| Reschke ほか | 標準化過程 | [ページ] |
この仕様は、HTTP の QUERY メソッドを定義します。 QUERY は、リクエストターゲットに対して、含まれている 内容を安全かつ冪等な方法で処理し、その処理結果を 応答として返すよう要求します。これは POST リクエストに似ていますが、QUERY リクエストは 部分的な状態変更を懸念することなく、自動的に繰り返したり 再開したりできます。¶
これはインターネット標準化過程の文書です。¶
この文書は、インターネット技術タスクフォース (IETF) による成果物です。IETF コミュニティの合意を表しています。この文書は 公開レビューを受け、公開について Internet Engineering Steering Group (IESG) の承認を得ています。インターネット標準に関する詳細な 情報は、RFC 7841 の第2節で確認できます。¶
この文書の現在の状態、正誤表、および フィードバックの提供方法に関する情報は、 https://www.rfc-editor.org/info/rfc10008 で確認できます。¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
この仕様は HTTP QUERY リクエストメソッドを、 ターゲットリソースがリクエストをどのように処理するかを記述した表現を含む、 安全かつ冪等なリクエスト(第 9.2 節、[HTTP])を 行うための手段として定義します。¶
一般的なクエリのパターンは次のとおりです。¶
しかし、伝達するデータが大きすぎてリクエストの URI にエンコードできない場合、 このパターンには問題が生じます。¶
GET を使用する代わりに、多くの実装では、 以下の例に示すように HTTP POST メソッドを使用してクエリを実行します。 この場合、クエリ操作への入力は、 リクエスト URI のクエリコンポーネントを使用する代わりに、 リクエスト内容として渡されます。¶
クエリを要求するための HTTP POST の典型的な使用例は次のとおりです。¶
しかし、この方式では、リクエストの送信先となるリソースとサーバーに関する 特別な知識がなければ、安全で冪等なクエリが実行されていることは 容易には分かりません。¶
QUERY メソッドは GET と POST の使用の間にある隔たりを埋める解決策を提供し、 上記の例は次のように表現できます。¶
POST と同様に、クエリ操作への入力はリクエスト URI の一部としてではなく、 リクエストの内容として渡されます。しかし POST とは異なり、このメソッドは明示的に安全かつ 冪等であり、キャッシュや自動再試行などの機能を動作させることができます。¶
重要なリソースはすべて URI によって識別されるべきであるという設計原則を踏まえ、 この仕様では、後で GET リクエストで使用できるように、サーバーが クエリ自体または特定のクエリ結果の両方に URI を割り当てる方法を説明します。¶
まとめると、次のようになります。¶
| GET | QUERY | POST | |
|---|---|---|---|
| 安全 | はい | はい | いいえの場合がある |
| 冪等 | はい | はい | いいえの場合がある |
| クエリ自体の URI | はい(定義上) | 任意(Location 応答フィールド) | いいえ |
| クエリ結果の URI | 任意(Content-Location 応答フィールド) | 任意(Content-Location 応答フィールド) | 任意(Content-Location 応答フィールド) |
| キャッシュ可能 | はい | はい | はい。ただし将来の GET または HEAD リクエストに対してのみ |
| 内容(本体) | 「定義されたセマンティクスなし」 | 想定される(セマンティクスはターゲットリソースによる) | 想定される(セマンティクスはターゲットリソースによる) |
QUERY メソッドは、サーバー側のクエリを開始するために使用されます。 ターゲット URI によって識別されるリソースの 表現を要求する GET メソッド (第 7.1 節、[HTTP]で定義)とは異なり、QUERY メソッドは、ターゲットリソースに対して、そのターゲットリソースの範囲内で クエリ操作を実行するよう要求するために使用されます。¶
リクエストの内容とそのメディアタイプによってクエリが定義されます。 オリジンサーバーは、ターゲットリソースに基づいて操作の範囲を決定します。¶
Content-Type リクエストフィールド([HTTP]、第 8.3 節) が欠落している場合、またはリクエスト内容と一致しない場合、サーバーはリクエストを 失敗させなければなりません。¶
すべての HTTP メソッドと同様に、ターゲット URI のクエリ部分は、 クエリ対象となるリソースの識別に関与します。それがクエリ結果に 直接影響するかどうか、およびどのように影響するかはリソース固有であり、 この仕様の範囲外です。¶
QUERY リクエストは、ターゲットリソースに関して安全です ([HTTP]、第 9.2.1 節)。 つまり、クライアントはターゲットリソースの状態を変更することを 要求も期待もしません。ただし、これはサーバーが、 追加情報を取得できる追加の HTTP リソースを作成することを 妨げるものではありません(第 2.3 節および 2.4 節を参照)。¶
さらに、QUERY リクエストは冪等です ([HTTP]、第 9.2.2 節)。 たとえば接続障害の後など、必要に応じて再試行または 繰り返すことができます。¶
第 15.3 節 、[HTTP]に従い、2xx(成功)応答コードは、 リクエストが正常に受信、理解、および受理されたことを示します。¶
特に、200(OK)応答は、クエリが正常に処理され、 その処理結果が応答内容として含まれていることを示します。¶
QUERY リクエストのセマンティクスは、リクエスト内容と、 メディアタイプなどの関連メタデータの両方に依存します([HTTP]、第 8.3.1 節)。 一般に、内容とメタデータが一致しないリクエストに関する問題は、4xx(クライアントエラー)応答 ([HTTP]、第 15.5 節)で 拒否しなければなりません。¶
以下の一覧では、さまざまな失敗ケースについて説明し、具体的なステータスコードを推奨します。¶
任意の QUERY リクエストに対する等価リソースとは、 GET リクエストに応答し、その QUERY リクエストとそのターゲットを表現し、 メッセージ内容とメタデータの両方を考慮するリソースです(第 6 節、[HTTP])。 特に、これにはコンテンツのメディアタイプなどの表現メタデータ (第 8 節、[HTTP]) が含まれます。¶
言い換えると、等価リソースは、QUERY を実装するリソースに リクエスト内容を組み込むことで導出されます。¶
等価リソースという用語は、選択された表現など、 HTTP の他の側面の動作を定義するために使用されます。サーバーはこれらのリソースに URI を割り当てることができますが、割り当てる必要はありません( 第 1.1 節、 [URI]を参照)。 割り当てた場合、これらのリソースは GET リクエストで アクセス可能になります。¶
成功応答(2xx、第 15.3 節、[HTTP])には、 操作結果に対応するリソースの識別子を含む Content-Location ヘッダーフィールドを含めることができます。 詳細については、第 8.7 節、[HTTP] を参照してください。これは、クライアントが示された URI に GET リクエストを送信して、 直前に実行したクエリ操作の結果を取得できるというサーバーからの主張を表します。 示されたリソースは一時的な場合があります。¶
サーバーは、QUERY リクエストの等価リソース(第 2.2 節)に URI を割り当てることができます。サーバーがそうする場合、そのリソースの URI を 2xx 応答の Location ヘッダーフィールドに含めることができます(第 10.2.2 節、[HTTP]を参照)。 これは、クエリ内容を再送信することなく、クライアントが 示された URI に GET リクエストを送信して、直前に実行したクエリ操作を 繰り返せるという主張を表します。このリソースの URI は 一時的な場合があります。将来のリクエストが失敗した場合、クライアントは 元の QUERY リクエストターゲットと以前に送信した内容を使用して再試行できます。¶
場合によっては、サーバーはユーザーエージェントを別の URI にリダイレクトすることで、 QUERY リクエストに間接的に応答することを選択できます( 第 15.4 節 、[HTTP]を参照)。¶
ステータスコード 301(恒久的に移動、[HTTP]、第 15.4.2 節)または 308(恒久的リダイレクト、[HTTP]、第 15.4.9 節) のいずれかを含む応答は、ターゲットリソースが Location 応答フィールド ([HTTP]、第 10.2.2 節)で参照される別の URI に恒久的に移動したことを示します。 同様に、ステータスコード 302(発見、[HTTP]、第 15.4.3 節)または 307(一時的リダイレクト、[HTTP]、第 15.4.8 節) のいずれかを含む応答は、ターゲットリソースが一時的に移動したことを示します。 4 つのすべての場合において、サーバーは、Location で参照される新しいターゲット URI に 同様の QUERY リクエストを送信することで、ユーザーエージェントが元の QUERY リクエストを 実行できることを示唆しています。¶
301 または 302 応答後に POST を GET リクエストとしてリダイレクトするための例外は、 QUERY リクエストには適用されないことに注意してください。¶
ステータスコード 303(See Other、第 15.4.4 節、[HTTP]) を含む QUERY への応答は、Location 応答フィールド ([HTTP]、第 10.2.2 節) で参照される URI に対する通常の取得リクエストを介して、 元のクエリを実行できることを示します。 HTTP の場合、これは 付録 A.4.3 の例に示すように、新しいターゲット URI に GET リクエストを送信することを意味します。¶
QUERY リクエストの選択された表現(第 3.2 節、[HTTP])は、その QUERY リクエストの 等価リソース(第 2.2 節)に対する GET リクエストの場合と同じです。¶
条件付き QUERY は、選択された表現 (すなわち、コンテントネゴシエーション後のクエリ結果)を、 第 13 節、 [HTTP]で定義されている 条件付きヘッダーフィールドで記述された条件の下でのみ 応答に返すことを要求します。¶
QUERY メソッドへの応答はキャッシュ可能です。キャッシュは、第 4 節、[HTTP-CACHING]に従って、 後続の QUERY リクエストを満たすためにそれを使用してもかまいません。¶
QUERY リクエストのキャッシュキー(第 2 節、[HTTP-CACHING])には、 リクエスト内容(第 6 節、[HTTP-CACHING])および関連する メタデータ(第 8 節、[HTTP])を 組み込まなければなりません。¶
キャッシュ効率を向上させるために、キャッシュは最初にリクエスト内容と関連メタデータから、 意味的に重要でない差異を取り除いてもかまいません。たとえば次の方法があります。¶
このような変換はすべて、キャッシュキーを生成する目的でのみ実行され、 リクエスト自体を変更するものではないことに注意してください。¶
クライアントは、「no-transform」キャッシュディレクティブ(第 5.2.1.6 節、[HTTP-CACHING]) を使用して、このような変換を行わないことを望むと示すことができます (ただし、このディレクティブは助言的なものにすぎないことに注意してください)。¶
QUERY メソッドの応答をキャッシュすることは、本質的に GET への応答を キャッシュするより複雑です。キャッシュキーを決定するには、 リクエスト内容を完全に読み取る必要があるためです。QUERY 応答が 等価リソース(第 2.2 節)の URI を示す Location 応答フィールド(第 2.4 節)を提供する場合、 クライアントは後続のリクエストで GET に切り替えることができ、 それによって処理を簡略化できます。¶
「Accept-Query」応答ヘッダーフィールドは、使用可能な 特定のクエリ形式のメディアタイプを識別しながら、 QUERY メソッドのサポートをリソースが直接通知するために使用できます。¶
Accept-Query には、パラメーターを除くメディア範囲値を含む Token または String のいずれかからなる List Structured Header Field を使用し、 「Structured Fields」構文 [STRUCTURED-FIELDS]で メディア範囲(第 12.5.1 節、 [HTTP])のリストを含みます。¶
メディアタイプのパラメーターがある場合、それらは String または Token 型の Structured Field Parameters にマッピングされます。 Token と String のどちらを選択するかは意味上重要ではありません。 つまり、受信者は Token を String に変換してもかまいませんが、 受信した型に基づいて異なる方法で処理してはなりません。¶
メディアタイプは Token に完全にはマッピングされません。たとえば、 先頭に数字を使用できます。このような場合は String 形式を 使用する必要があります。¶
サポートされるワイルドカードの使用法は、任意のタイプに一致する「*/*」、 または示されたタイプの任意のサブタイプに一致する「xxxx/*」のみです。¶
フィールド値に列挙されたタイプの順序に意味はありません。¶
Accept-Query フィールドの値は、サーバー上で同じパスを共有するすべての URI に適用されます。 言い換えると、クエリコンポーネントは無視されます。同じリソースへのリクエストが 異なる Accept-Query 値を返した場合は、 第 4.2 節、[HTTP-CACHING]に従って、 最も最近受信した新鮮な値が使用されます。¶
例:¶
Accept-Query: "application/jsonpath", application/sql;charset="UTF-8"¶
このフィールドの構文は、「Accept」(第 12.5.1 節、[HTTP]) などの他のフィールドと似ているように見えますが、 これは Structured Field であるため、 第 4 節、[STRUCTURED-FIELDS]で指定されているとおりに 処理しなければなりません。¶
QUERY メソッドには、[HTTP]で説明されている すべての HTTP メソッドと同じ一般的なセキュリティ上の 考慮事項が適用されます。¶
URI(たとえばクエリコンポーネント)でリクエスト情報を 渡す代わりに使用できます。URI はリクエスト内容よりも 仲介者によってログに記録されたり、その他の方法で処理されたりする可能性が高いため、 場合によってはこちらが望ましいことがあります。別の場合には、クエリに 機密情報が含まれていると、URI がログに記録される可能性があることから、 GET より QUERY を使用する動機になることがあります。¶
サーバーが QUERY リクエストの結果を表現する一時的なリソースを作成し (たとえば Location または Content-Location フィールドで使用するため)、 そのリソースに URI を割り当て、リクエストにログへ記録できない機密情報が含まれている場合、 その URI は、元のリクエスト内容の機密部分を含まないように 選択すべきです。¶
QUERY の内容を誤って正規化したり、 リソースが内容を処理する方法と大きく異なる方法で正規化したりするキャッシュは、 正規化によって偽陽性が生じた場合、誤った応答を返す可能性があります。¶
Cross-Origin Resource Sharing(CORS)を実装するユーザーエージェントからの QUERY リクエストには、 QUERY が CORS セーフリストメソッドの集合に含まれないため、 「プリフライト」リクエストが必要になります ([FETCH]を参照)。¶
IANA は、QUERY メソッドを <http://www.iana.org/assignments/http-methods> の「Hypertext Transfer Protocol (HTTP) Method Registry」に追加しました (第 16.3.1 節、[HTTP]を参照)。¶
| メソッド名 | 安全 | 冪等 | 仕様 |
|---|---|---|---|
| QUERY | はい | はい | RFC 10008 の 第 2 節 |
IANA は、Accept-Query フィールドを <https://www.iana.org/assignments/http-fields> の「Hypertext Transfer Protocol (HTTP) Field Name Registry」 に追加しました (第 16.1.1 節、[HTTP]を参照)。¶
| フィールド名 | 状態 | 構造化型 | 参照 | コメント |
|---|---|---|---|---|
| Accept-Query | 恒久 | List | RFC 10008 の 第 3 節 |
以下の例は説明のみを目的としています。実際にこれほど短いクエリを 送信する必要がある場合は、GET を使用する方が適している可能性があります。¶
ほとんどの例で使用されるメディアタイプは「application/x-www-form-urlencoded」です (ブラウザーのユーザークライアントからの POST リクエストで使用され、 [URL] の 「application/x-www-form-urlencoded」 で定義されています)。 簡潔にするため Content-Length フィールドは省略されています。¶
QUERY のサポートを検出する簡単な方法として OPTIONS (第 9.3.7 節、[HTTP]) メソッドがあります。¶
応答:¶
Allow 応答フィールド(第 10.2.1 節、[HTTP])は、指定されたリソースで サポートされるメソッドの集合を示します。¶
OPTIONS を使用する以外の方法もあります。たとえば、サーバーがサポートしているかを 事前に知らなくても QUERY リクエストを試すことができます。その場合サーバーは リクエストを処理するか、Allow 応答フィールドを含む 405(メソッド不許可、 第 15.5.6 節、[HTTP]) などの 4xx ステータスで応答できます。¶
QUERY でサポートされているメディアタイプは、 Accept-Query 応答フィールド(第 3 節) によって検出できます。¶
応答:¶
どのリクエストメソッドへの応答に Accept-Query が含まれるかは、 アクセスされるリソースによって異なります。¶
Accept-Query を確認する代わりに QUERY リクエストを行い、 415 応答(サポートされていないメディアタイプ、第 15.5.16 節、[HTTP]) などの 4xx ステータスになった場合に、 Accept 応答フィールド(第 12.5.1 節、[HTTP]) を確認する方法もあります。¶
第 2.3 節および 2.4 節で説明したように、 成功応答(2xx、第 15.3 節、[HTTP])の Content-Location および Location 応答フィールドは、 受信したリクエストの結果、または同じ操作を実行する将来のリクエストのいずれかについて、 GET リクエストに応答する代替リソースを識別する方法を提供します。 付録 A.1 の例に戻ると、次のようになります。¶
応答:¶
上で受信した Content-Location 応答フィールドは、 それが含まれていた QUERY 応答の結果を保持するリソースを識別します。¶
応答:¶
サーバーがこのリソースを無期限に実装し続ける保証はないため、 エラー応答の後、クライアントは新しい代替ロケーションを取得するために 元の QUERY リクエストを再実行する必要があることに注意してください。¶
Location 応答フィールドは、元の QUERY リクエストと同じ処理およびパラメーターに対する 現在の結果を GET への応答として返すリソースを識別します。¶
この例では、Last-Modified フィールドで示されるように、 2024-11-17T16:12:01Z に 1 件のエントリーが削除されたため、 応答には 2 件のエントリーだけが含まれます。¶
サーバーが引き続きリソースを公開しており、クエリ結果に変更がなかったと仮定すると、 次を含む後続の条件付き GET リクエストは、¶
304(未変更)応答になります(第 15.4.5 節、[HTTP])。¶
リクエストメディアタイプとして「application/sql」と 「application/xslt+xml」[XSLT]を サポートし、「text/csv」として応答を生成できる QUERY 実装リソースを考えます。 クエリ対象のデータセットには RFC 文書情報が含まれ、 クエリは年代別にグループ化された情報を返します。¶
応答:¶
ここでは、サーバーが GET で後から使用するために、等価リソース (第 2.4 節)に パス「/stored-queries/4815162342」を割り当てています。¶
後でクライアントはクエリを繰り返しますが、 結果が変更された場合にのみ返すよう指定します。¶
クエリ対象のデータに変更がなかったため、サーバーは次のように応答します。¶
サーバーが等価リソースの URI を識別したため、そのリソースには GET でアクセスできます。特に、これによりクエリリクエストの 内容を再送信する必要がなくなります。¶
ここではデータセットの状態が実際に変更されたため、新しい内容が返されます。¶
(この年代の行における変更に注意してください。)¶
以下の図は、条件付きリクエストの使用と、等価リソースに URI が割り当てられている場合 (およびクライアントがそれを利用している場合)にどのように異なるかを示しています。 架空のフィールド名「Validator」は説明目的で使用されています。¶
以下の例は、RFC の正誤表からなる JSON 形式の [RFC8259] データベースに対するリクエストを示します。¶
以下のリクエストは、eXtensible Stylesheet Language Transformations(XSLT)を使用して、 年および定義された正誤表の種類ごとにまとめられた 正誤表情報を抽出します。¶
応答:¶
別のクエリ形式である JSONPath [RFC9535] もサポートされていることを示す Accept-Query 応答フィールドに注意してください。 以下のリクエストは、2024 年以降に送信された拒否済みのすべての正誤表の 識別子を報告します。¶
応答:¶
「Hypertext Transfer Protocol (HTTP) Method Registry」(<http://www.iana.org/assignments/http-methods>) には、「安全」かつ「冪等」というプロパティを持つ他の 3 つのメソッド、 「PROPFIND」[RFC4918]、 「REPORT」[RFC3253]、および 「SEARCH」[RFC5323]がすでに含まれています。¶
これらのいずれかを再利用し、この仕様で新しいメソッド「QUERY」として 定義しているものに一致するよう更新することも可能でした。実際、 この仕様の初期段階では「SEARCH」が使用されていました。¶
最終的にメソッド名「QUERY」が選択された理由は次のとおりです。¶
アイデア、レビュー、フィードバックを提供してくださった HTTP Working Group のすべてのメンバーに感謝します。¶
特に以下の方々に感謝します。 Carsten Bormann、 Mark Nottingham、 Martin Thomson、 Michael Thornburgh、 Roberto Polli、 Roy Fielding、および Will Hawkins。¶
Ashok Malhotra は、この仕様につながる初期の議論に 参加しました。¶
この HTTP メソッドに関する議論は、2019 年の HTTP Workshop で Asbjørn Ulsberg によって再開されました。¶