1. ホーム
  2. rest

[解決済み] HTTP GET(リクエストボディ付き

2022-03-18 17:59:42

質問

アプリケーションのために新しいRESTfulなウェブサービスを開発しています。

あるエンティティに対してGETを行うと、クライアントはそのエンティティの内容を要求することができます。 もし、何らかのパラメータを追加したい場合(例えば、リストのソートなど)には、クエリ文字列でこれらのパラメータを追加することができます。

あるいは、リクエスト・ボディでこれらのパラメータを指定できるようにしたい。 HTTP/1.1 は、これを明確に禁止していないようです。これにより、より多くの情報を指定できるようになり、複雑な XML リクエストの指定がより簡単になるかもしれません。

私の質問です。

  • これは良いアイデアなのでしょうか?
  • HTTPクライアントは、GETリクエスト内でリクエストボディを使用する際に問題が発生しますか?

https://www.rfc-editor.org/rfc/rfc2616

解決方法は?

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 spec"として参照されたRFC2616は、現在では廃止されています。2014年にはRFC 7230-7237に置き換わっています。引用"the message-body SHOULD be ignored when handling the request"は削除されました。現在は、"Request message framing is independent of method semantics, even if the method doesn't define any use for a message body" 2nd quote "The GET method means retrieve whatever information ... is identified by the Request-URI" が削除されただけです。 - コメントより

から HTTP 1.1 2014年版仕様 :

GETリクエストメッセージ内のペイロードは、定義されたセマンティクスを持たない。GETリクエストでペイロードボディを送信すると、既存の実装によってはリクエストを拒否する原因になるかもしれない。