API を設計していますが、GET 要求で JSON ペイロードを送信しても問題ないでしょうか?
この他の質問Payloads of HTTP Request Methodsでは、このリンクに従って見つけることができます:
- HEAD - 本体のセマンティクスが定義されていません。
- GET - 本体のセマンティクスが定義されていません。
- PUT - 本文がサポートされています。
- POST - 本文対応。
- DELETE - 本体のセマンティクスが定義されていません。
- TRACE - 本文はサポートされていません。
- オプション - ボディはサポートされていますが、セマンティクスはサポートされていません (おそらく将来的に)。
これは、ペイロードを含む GET リクエストを送信してはならないということですか? そうするリスクはありますか?
- 一部の HTTP クライアント ライブラリがそのようなペイロードを送信できないのはどうですか?
- または、Java API コードが特定のアプリケーション サーバーで移植できないのでしょうか?
- 他に何か?
私は、ElasticSearch が GET 要求でそのようなペイロードを使用していることを発見しました。
$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{
"query": {
"filtered" : {
"query" : {
"query_string" : {
"query" : "some query string here"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
}
}
}
}
'
それで、この人気のあるライブラリがそれを行い、誰も文句を言わないなら、おそらく私は同じことをすることができますか?
ところで、これが queryString パラメータと JSON ペイロードを混在させてもよいかどうかを知りたいですか? この ElasticSearch クエリとまったく同じです。もしそうなら、どの引数が queryString パラメータまたはペイロード パラメータであるべきかを知るためのルールはありますか?
ここで読み取ることができます: リクエスト本文を含む HTTP GET
GET リクエストに本文を含めることに関する Roy Fielding のコメント。
はい。つまり、どの HTTP 要求メッセージにもメッセージ本文を含めることが許可されているため、そのことを念頭に置いてメッセージを解析する必要があります。ただし、GET のサーバー セマンティクスは制限されているため、ボディが存在する場合でも、リクエストに対してセマンティックな意味はありません。解析に関する要件は、メソッドのセマンティクスに関する要件とは別のものです。
したがって、はい、GET を使用して本文を送信できますが、そうしても役に立ちません。
これは HTTP/1.1 の階層化された設計の一部であり、仕様が分割されると再び明確になります (作業中)。
....ロイ
私の意見では、queryParamまたはmatrixParamにうまく適合しない複雑なクエリをサーバーに送信することは理にかなっているからです。ElasticSearch API の設計者も同じことを考えていると思います...
次のように呼び出すことができる API を設計する予定です。
curl -XGET 'http://localhost:9000/documents/inbox?pageIndex=0&pageSize=10&sort=title'
curl -XGET 'http://localhost:9000/documents/trash?pageIndex=0&pageSize=10&sort=title'
curl -XGET 'http://localhost:9000/documents/search?pageIndex=0&pageSize=10&sort=title' -d '{
"someSearchFilter1":"filterValue1",
"someSearchFilter2":"filterValue2",
"someSearchFilterList": ["filterValue3","xxx"]
... a lot more ...
}
'
それはあなたにはうまく見えますか?以上の考察に基づきます。