2013-05-03 27 views
12

私はAPIを設計していますが、GETリクエストでJSONペイロードを送信するのが良いのだろうか?この他の質問Payloads of HTTP Request MethodsHTTPリクエストのペイロードを取得する

、我々はthis linkに応じて見つけることができます。

  • 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" } 
      } 
     } 
    } 
} 
' 

だから、この人気libaryはそれをしないと、誰も文句ない場合は、おそらく私は同じことを行うことができますか?

ところでこれはqueryStringパラメータとJSONペイロードを混在させても問題ないのですか?このElasticSearchクエリのようになります。もしそうなら、どの引数がqueryStringパラメータまたはペイロードパラメータでなければならないかを知るためのルールがありますか?ここで


我々は読むことができます:GETリクエストで体を含めて約 HTTP GET with request body

ロイフィールディングのコメントを。

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

はい、GETを使用して本文を送信できます。いいえ、 には役に立ちません。

これはHTTP/1.1のレイヤード設計の一部で、仕様がパーティション化された時点で(作業中)再び になります。

....ロイ

それはqueryParamにうまく収まらないサーバーへの複雑なクエリを送信するために私の意見では理にかなっているので、それは、便利なことはありませんなぜ、私は本当に理解していませんまたはmatrixParam。 は、私はそのように呼び出すことができるAPIを設計する予定です


... ElasticSearchの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 ... 
} 
' 

が、それはあなたに罰金に見えるのか?上記の考慮事項に基づきます。


+1

一つのリスクはクライアントライブラリは、ペイロードがGEに送信することを許可しないことになります行くようにTリクエスト。私はあなたがカールで正直にこれを行うことができることを理解していませんでした。 – bdkosher

答えて

1

リクエストの本文に基づいてGETレスポンスが異なると、キャッシングが中断されます。そこに行かないでください。

+0

これは、クライアントを識別するOAuth2ヘッダーでコンテキスト化されているため、キャッシングが不要なAPIです。異なるクライアントは同じリソースURIの異なる表現を持つことができるので、私はリソースURIに基づいてキャッシングを行うことができません –

+0

すべての中間媒体/ライブラリもそれを認識していますか? –

+0

は、ユーザーアカウントの操作を許可するOAuth2トークンにアクセスする必要があるためです。したがって、/ profileリソースは、クライアントがOAuth2トークン(ヘッダとして与えられる)を持つユーザプロファイルです。 –

1

一般的なWebフレームワークであるGoogle App Engineは、特別なURL取得ライブラリdoes not support making HTTP GET requests with a payloadを使用します。したがって、APIをGoogle App Engineのユーザーに届けるには、この動作を要求することはお勧めしません。

Googleでan issue regarding thisを開設しました。

+0

'GET'リクエストを作成する必要がある場合、リクエスト本体を送信するのではなく、' source' query-stringパラメータでリクエストの本文をurlencodeすることができます。 –

0

と何もしていないため、になります。恥ずかしがり屋のように聞こえるかもしれませんが、規格についてのことは、標準であり、HTTPは最も確立された標準の1つです。完璧ではないし、多くの人が変更したいことがたくさんありますが、ほぼすべての人がまだURLパラメータを使用するケースがあります信頼できる代替手段

bodyplane/payloadでGETリクエストに依存する場合、speedplaneとJulian Reschkeの回答から2つの具体的な例が分かります。必要に応じて、あなたのアプリを他のユーザーと違う形で書くこともできますが、ウェブは標準がおそらく通常よりも真剣に取られるべきです。私はそれが先駆者になることを夢中にしていることは知っていますが、尊敬の念を持って、いくつのウェブサイトが存在しているか、そこにいくつのウェブプログラマーが存在しているのかを考えてみてください。確かに良い方法があれば、これまでに生産で幅広く使用されていると思われます。

多くの人が仕事に同意する必要があるので、標準の変更/採用が遅れます。 という規則を破るアプリケーションだと言っても間違いありませんが、Aetherusが別のコメントにコメントしたように、回避策や冗長対策が必要な場合があります。回答。私はこのような問題に対して、少なくとも抵抗の道を取る傾向があります。あなたが本当にそれをしたい場合、私はあなたがそれを動作させることができると確信しています。

1

参照:HTTP GET with request body - 詳細については、こちらをご覧ください。

要旨は次のとおりです。はいすることができますが、あなたはおそらく含めて、さまざまな理由ではないはずです。

  • あなたはおそらくあなたが
  • (あなたはおそらく、投稿したい)HTTP仕様勧告をも無視しています紹介キャッシュが発行
  • これでない直感的な限りREST APIは
関連する問題