私たちのアプリケーション用に新しい RESTful Web サービスを開発しています。
特定のエンティティに対して GET を実行すると、クライアントはエンティティのコンテンツを要求できます。パラメータを追加したい場合 (リストの並べ替えなど)、クエリ文字列にこれらのパラメータを追加できます。
あるいは、リクエスト本文でこれらのパラメータを指定できるようにしたいと思います。1.1 のこれを明示的に禁止しているわけではないようです。これにより、より多くの情報を指定できるようになり、複雑な XML リクエストの指定が容易になる可能性があります。
私の質問:
- これは全体として良い考えでしょうか?
- HTTP クライアントでは、GET リクエスト内でリクエスト本文を使用すると問題が発生しますか?
ベストアンサー1
GET リクエストに本文を含めることに関する Roy Fielding のコメント。
はい。つまり、すべての HTTP リクエスト メッセージにはメッセージ本文を含めることができるため、その点を考慮してメッセージを解析する必要があります。ただし、GET のサーバー セマンティクスは制限されており、本文がある場合でも、リクエストに対して意味を持ちません。解析の要件は、メソッド セマンティクスの要件とは別です。
したがって、GET を使用して本文を送信することは可能ですが、そうすることは決して有用ではありません。
これは HTTP/1.1 の階層化設計の一部であり、仕様が分割されると再び明確になります (作業中)。
....ロイ
はい、GETでリクエストボディを送信できますが、意味を持たせるべきではありません。サーバー上で解析し、その内容に基づいて応答を変更することで意味を持たせる場合は、この推奨事項を無視していることになります。HTTP/1.1 仕様、セクション 4.3:
...リクエストメソッドにエンティティ本体の定義されたセマンティクスが含まれていない場合、メッセージ本体はすべきリクエストを処理するときに無視されます。
GETメソッドの説明はHTTP/1.1 仕様、セクション 9.3:
GET メソッドは、Request-URI によって識別されるあらゆる情報 ([...]) を取得することを意味します。
これは、リクエスト本文は GET リクエスト内のリソースの識別の一部ではなく、リクエスト URI のみであることを示しています。
アップデート
「HTTP/1.1 仕様」として参照されている RFC2616 は、現在では廃止されています。2014 年に RFC 7230-7237 に置き換えられました。引用「リクエストを処理する際、メッセージ本体は無視されるべきである」は削除されました。現在は「メソッドがメッセージ本体の使用を定義していない場合でも、リクエスト メッセージのフレーミングはメソッドのセマンティクスとは無関係である」となっています。2 番目の引用「GET メソッドは、リクエスト URI によって識別されるあらゆる情報を取得することを意味します」は削除されました。 - コメントより
GET リクエスト メッセージ内のペイロードには定義されたセマンティクスがありません。GET リクエストでペイロード本体を送信すると、既存の実装によってはリクエストが拒否される可能性があります。