web-dev-qa-db-ja.com

RESTリクエストをGET用にエンコードできません(URLが長すぎます)

例:

問題:検索語が長すぎて、Webサーバーの最大URL長を超えている可能性があります。

非常に長い検索用語を許可し、それでもRESTfulを維持するにはどうすればよいですか?

22
feklee

インスピレーションを得るために、 GoogleTranslateのAPIv2 を調べました。これは、 "RESTful呼び出しスタイルを使用しています。"

当然、翻訳されるテキストはかなり長くなる可能性があります。そのため、GoogleはオプションでPOSTを使用してリクエストを送信することを許可していますが、ひねりを加えています。

POSTを使用するには、X-HTTP-Method-Overrideヘッダーを使用して、リクエストをGETとして処理するようにTranslate APIに指示する必要があります(X-HTTP-Method-Override: GETを使用)。

したがって、意味論的にPOSTリクエストをGETリクエストに変換することが可能です。

(この発見により、質問に x-http-method-override タグを追加することになりました。)

35
feklee

RESTはPOSTの作成を制限しません。CRUDをHTTPメソッドにマッピングすることに注意し、それがRESTfulであると想定してください。POSTは、そうでないアクションに使用されるメソッドです。 tHTTPによって標準化されています。

標準ではURIの制限が確立されていないため、これは壊れた実装と見なすことができ、修正しても問題ありません。回避策がAPIに疎結合されている限り、RESTfulです。つまり、APIは変換を実装したり、直接オーバーライドしたりするのではなく、リクエストを適切に書き換える何らかのプリプロセッサ上で実装する必要があります。これは実装の失敗によるものであり、最終的には廃止されると予想されることをどこかに明確に文書化する必要があります。

2
Pedro Werneck

クエリが長すぎて最大長を超える可能性がある場合は悪臭がします(ブラウザの事実上は2000文字ですが、REST API)にアクセスする他の手段ではそれより長くなる可能性があります)。

ユーザーがその量のデータを渡すことができる場合は、URLではなくリクエストの本文/データフィールドに入力する必要があります。

0
smcg