web-dev-qa-db-ja.com

Restful APIの場合、GETメソッドはJSONデータを使用できますか?

URIにそれほど長いパラメーター文字列が表示されないようにします。では、GETメソッドはJSONデータを使用できますか?

私の状況では、パラメータの種類を指定して結果をフィルタリングする必要があります。パラメーターが多い場合、長さがURIの制限を超える可能性があります。だから、この問題のベストプラクティスはありますか?

37
HappyLiang

理論的には、GETリクエストでリクエスト本文を送信することを妨げるものは何もありません。 HTTPプロトコルでは許可されますが、セマンティクスが定義されていないため、クライアントがGETペイロードを送信したときに実際に何が起こるかを文書化するのはユーザー次第です。たとえば、JSONボディのパラメーターがクエリ文字列パラメーターまたは他のパラメーターと完全に同等であるかどうかを定義する必要があります。

ただし、明確に定義されたセマンティクスがないため、アプリケーションとクライアント間の実装がそれを尊重するという保証はありません。サーバーまたはプロキシは、リクエスト全体を拒否するか、本文などを無視します。壊れた実装に対処するREST方法は、アプリケーションから切り離された方法でそれを回避することです。したがって、ベストプラクティスと考えられる2つのオプションがあると思います。

簡単なオプションは、他の回答で推奨されているように、POSTの代わりにGETを使用することです。 POSTはHTTPによって標準化されていないため、どのように機能するかを正確に文書化する必要があります。

私が好むもう1つのオプションは、GETペイロードが改ざんされないことを前提にアプリケーションを実装することです。次に、何かが壊れた実装を持つ場合、クライアントがX-HTTP-Method-OverrideでHTTPメソッドをオーバーライドできるようにします。これは、クライアントがPOSTでHTTPメソッドをエミュレートする一般的な規則です。そのため、クライアントの実装が壊れている場合、GETリクエストをPOSTとして記述し、X-HTTP-Method-Override: GETメソッドを送信して、アプリケーション実装から切り離されたミドルウェアを作成できます。それに応じてメソッドを書き換えます。あなたが純粋主義者なら、これが最良の選択肢です。

32
Pedro Werneck

質問に答えるために、はい。GETリクエストの一部としてURIでJSONを渡すことができます(URLエンコードが提供されている場合)。ただし、これを行う理由はURIの長さによるものであるため、JSONの使用は自己無効になります(必要以上の文字が導入されます)。

POSTリクエストの本文で、通常のCGIスタイル(param1=val1&param2=val2)またはJSON(受信時にAPIによって解析)でパラメーターを送信することをお勧めします

6
jfrattarola