2017-07-13 21 views
1

検索するコレクションのすべてのIDを表す、クエリ文字列内の多くのデータを使用してHTTP GETリクエストを行います。クエリ文字列内に多くの項目を含むHTTP GETリクエスト

URLのクエリ文字列の長さの制限については、迅速なGoogle検索は言う:

RFC 3986にも制限がないと述べたが、ホスト名があるため、255文字に制限さ であることを示していますのDNS制限(セクション2.3.3)。 マイクロソフトは、Internet Explorer でのURLの最大長は、パスに超えない2,048文字で2083文字、 URL.May 1の一部、2009

我々はIEを使用しない場合であると述べていますクエリ文字列の長さの制限を超えてしまう可能性がありますか? 特に、GETリクエストのクエリ文字列にイメージを表すbase64文字列が含まれていると、Node.js Expressサーバーで制限を超えていることがわかりました。

この問題を回避するには、どのような方法が良いですか?代わりにHTTP POSTリクエストを使用するだけですか?確かに、この問題を回避するために、1つのGETリクエストを1000に分解したくないのです。

+0

Chrome Canaryを使用すると、URLの長さが非常に短くなりました(間違いなく、無制限に近いものは間違いありません)。 –

+0

これは、ドキュメント/行ごとに変更されないフィールドでコレクションを照会する方法を見つけるのが最善のようです。そのため、各行に固有のIDの代わりに、取得するコレクションのサブセットを識別できる共有IDを検索します。 –

+0

https://stackoverflow.com/questions/14202257/design-restful-query-api-with-a-long-list-of-query-parameters、https://stackoverflow.com/questions/4203686/how-can -i-deal-with-http-get-query-string-length-limitation-and-b-to-b、https://stackoverflow.com/questions/5020704/how-to-design-restful-search -filtering、https://stackoverflow.com/questions/207477/restful-url-design-for-search – CodeCaster

答えて

2

RESTful Webサービスでは、GETはデータを取得します。 POST要求はサーバー上にデータを作成し、サイズの制限はありませんが、サーバーはしばしば変更可能な既定の制限を持っています。

RESTfulアプリケーションを維持することが状況に当てはまらない場合は、POSTを使用できます。

GET要求はキャッシュできますがPOST要求はできないことに注意することが重要です。そのため、多くの(同じ)データを取得する場合は、GETを使用する必要があります。

0

私は私ではなく、POSTのBASE64でGETを介して画像を渡すために十分な理由を見つけることができません(それは何かのようなにおいがするよりも、あなたがを超える長さのGET要求を持っている場合は、デザインで間違っていると言うでしょうあなたが言ったように)。 私はむしろそのシナリオでPOSTと一緒に行きたいと思います。また、2048文字の制限について調べると、実際には適用されないようです。firefox and Chromeを参照してください。microsoft iehere a more detailed analysisについてのこの情報には依存しません。

また、パラメータの名前と値に文字列短縮文字を実装することも考えられますが、私の意見では可読性が重要です。 javacriptのパラメータを短縮する方法については、thisの質問をご覧ください。

4

APIをきれいにしてRESTfulに保つつもりなら、リクエストを2つの部分に分割できます。最初のユーザーは、設定(POST)のためにサーバーに構成を送信します。 2番目の結果は結果を収集します(GET)。

このアプローチには、ブラウザ、ファイアウォール、ルータなどでHTTP GETの限界を克服することを除いて、複数の利点があります。たとえば、後で部分的な結果ポーリングを導入したり、さらに、URLを短くしてユーザーが読めるようにします。

実装の詳細はすでにhereと記載されています。

0

IE applies to both GET and POST requestsの制限から、まず最初に、POSTリクエストが完全にあなたの問題を解決するわけではありません。

ブラウザの場合、there's no universal limitでは、各ブラウザに異なる制限が適用されます。

さらに、Webブラウザの制限を除いて、サーバーにもデフォルトまたは設定のいずれかの制限があります(例:Apache's LimitRequestLine Directive)。

また、データ処理時にメモリの問題が発生する可能性があります(PHPなど)。PHPには設定可能なpost_max_sizeディレクティブがあります。

一般的に、この件に関するコンセンサスは、GET要求の長さを最大2000文字に制限したり、POST要求を使用することを約束しています(ただし制限もあります)。

私の提案:リクエストを切り捨て、リクエストが可能な解決策であるかもしれない最終フラグが付属していたときに、サーバーによって保存され、処理され得るいくつかの要求を送信します。また、大きなデータの圧縮と解凍に役立つ文字列圧縮ライブラリもあります。たとえば、数十のプログラミング言語で動作するLZW compressionを参照してください。

関連する問題