web-dev-qa-db-ja.com

HTTPリクエストペイロードを取得する

APIを設計していますが、GETリクエストでJSONペイロードを送信しても問題ないのでしょうか。

この他の質問では HTTPリクエストメソッドのペイロードこのリンク に従って見つけることができます:

  • 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リクエストに本文を含めることに関するRoyFieldingのコメント。

はい。つまり、HTTP要求メッセージにはメッセージ本文を含めることができるため、それを念頭に置いてメッセージを解析する必要があります。ただし、GETのサーバーセマンティクスは、本文が存在する場合、要求に対してセマンティックな意味を持たないように制限されています。解析の要件は、メソッドのセマンティクスの要件とは別のものです。

したがって、はい、GETを使用して本文を送信できますが、いいえ、そうすることは決して役に立ちません。

これはHTTP/1.1の階層化された設計の一部であり、仕様が分割されると(作業が進行中)再び明らかになります。

....ロイ

それから、queryParamまたはmatrixParamにうまく適合しない複雑なクエリをサーバーに送信することは私の意見では理にかなっているので、なぜそれが決して役に立たないのか本当に理解していません。 ElasticSearchAPIデザイナーも同じように考えていると思います...


次のように呼び出すことができる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 ...
}
'

それはあなたにとって問題ないと思われますか?上記の考慮事項に基づいています。


13

GET応答を要求の本文に基づいて変化させると、キャッシュが中断されます。そこに行かないでください。

3
Julian Reschke

人気のあるウェブフレームワークであるGoogleApp Engineは、特別なURLフェッチライブラリを使用します。これは ペイロードを使用したHTTP GETリクエストの作成をサポートしていません 。したがって、APIをGoogle App Engineユーザーに到達させたい場合は、この動作を要求することはお勧めしません。

私は開いた これに関する問題 グーグルで。

2
speedplane

詳細については、 リクエスト本文を含むHTTP GET -も参照してください。

要点は次のとおりです。はい、できますが、次のようなさまざまな理由で行うべきではありません。

  • HTTP仕様の推奨事項を無視している可能性があります(おそらくPOSTしたいでしょう)
  • キャッシュの問題が発生する可能性があります
  • これは、REST APIが進む限り、not直感的です
1
a darren

あなたが何かをすることができるからといって、あなたすべきであるという意味ではありません。これが腹立たしいトートロジーに聞こえる場合は申し訳ありませんが、標準についてのことは、それらが標準であるということです-そしてHTTPはそこにある最も確立された標準の1つです。完璧ではなく、多くの人が変更したいことがたくさんありますが、ほとんどの人がまだこのようなユースケースにURLパラメータを使用しているという事実は、私にはそれがないことを十分に示しています現在、信頼できる代替手段があります。

SpeedplaneとJulianReschkeの回答は、本体/ペイロードを使用したGETリクエストに依存している場合に機能しなくなる2つの具体的な例を示しています。必要に応じて、他の人とは異なる方法でアプリを作成できますが、Webは、標準を通常よりもさらに真剣に受け止める必要がある領域の1つです。先駆者になりたくなることは承知していますが、敬意を払って、存在するWebサイトの数と、それらを構築および保守しているWebプログラマーの数を考慮してください。間違いなくより良い方法があったとしたら、それが今では本番環境で広く使用されているのを目にするでしょう。

非常に多くの人々がそれらが機能するためにそれらに同意しなければならないので、標準はゆっくりと変化/採用されます。ルールに違反するアプリケーションがあるあると言っているのは正しいですが、それらが人々の頭痛の種であり、回避策/冗長性を引き起こしていることに気付くでしょう。 Aetherusが別の回答に対するコメントで述べているように、特定の場合には対策が必要です。私はこのような問題に対して最も抵抗の少ない道をたどる傾向があります。あなたが本当にそれをやりたいのなら、あなたはそれを機能させることができると確信しています。

0
Toadfish