1. ホーム
  2. http

[解決済み] HTTP GETのクエリ文字列の長さの制限に対処しつつ、RESTfulにするにはどうすればよいですか?

2023-03-19 11:39:44

質問

で述べたように http://www.boutell.com/newfaq/misc/urllength.html で述べたように、HTTP クエリ文字列は長さに制限があります。クライアント(Firefox、IE、...)、サーバ(Apache、IIS、...)、ネットワーク機器(アプリケーションファイアウォール、...)によって制限される可能性があります。

今日、私は検索フォームでこの問題に直面しました。私たちは多くのフィールドを持つ検索フォームを開発し、このフォームは GET リクエストとしてサーバーに送信されるので、私は結果ページをブックマークすることができます。

フィールドが多いので、クエリ文字列は 1100 バイトになり、1024 バイトを超える HTTP GET リクエストをドロップするファイアウォールを使用しています。システム管理者は、制限がないように、代わりに POST を使用するよう勧めています。

確かにPOSTは有効ですが、私は本当にPOSTではなくGETとして検索を感じています。ですから、クエリ文字列が長すぎないようにフィールド名を見直して、できない場合は現実的に考えて、POSTを使用することになると思います。

しかし、RESTfulサービスの設計に欠陥があるのでしょうか?GET リクエストの長さに制限がある場合、RESTful Web サービスに大きなオブジェクトを送信するにはどうすればよいのでしょうか。例えば、ファイルに基づいて計算を行うプログラムを持っていて、このようなRESTfulなウェブサービスを提供したいとします。 http://compute.com?content=<base64 file> . クエリ文字列の長さは無制限ではないので、これはうまくいきません。

ちょっと困惑しています...。

どのように解決するのですか?

あなたの記述に基づくと、IMHOはあなたがPOSTを使用する必要があります。POST はデータをサーバーに置くためのもので、場合によっては回答を得ることもできます。あなたのケースでは、検索を行い(サーバーにクエリを送信)、その検索結果を取得します(クエリの結果を取得)。

GETの定義では、すでに存在するリソースを取得するために使用しなければならないとされています。POSTの定義では、POSTは新しいリソースを作成することです。これはまさに、サーバー上にリソースを作成し、それを取得することです! 検索結果を保存しなくても、サーバー上にオブジェクトを作成し、それを取得したことになります。PeterMmm が言ったように、POST (クエリ結果を作成して保存する) でこれを行い、GET でクエリを取得することもできますが、POST だけを行って結果を取得する方がより現実的でしょう。

これが役に立つといいのですが! :)