URL クエリパラメータを使用した HTTP POST — 良いアイデアかどうか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/611906

  •  03-07-2019
  •  | 
  •  

質問

HTTP を経由する API を設計しているのですが、URL クエリ パラメーターのみを使用し、リクエスト本文を使用しない HTTP POST コマンドを使用するのが良い方法なのかどうか疑問に思っています。

考慮事項:

  • 「優れた Web デザイン」では、非冪等アクションを POST 経由で送信する必要があります。これは非冪等なアクションです。
  • URL にリクエスト パラメーターが存在すると、このアプリの開発とデバッグが簡単になります。
  • API は広範な使用を目的としたものではありません。
  • 本文なしで POST リクエストを行うには、もう少し作業が必要になるようです。ある Content-Length: 0 ヘッダーを明示的に追加する必要があります。
  • また、本文のない POST は、ほとんどの開発者と HTTP フレームワークの期待に少し反するように思えます。

リクエスト本文ではなく URL クエリを介して POST リクエストでパラメータを送信することに他にも落とし穴や利点はありますか?

編集:これが検討されている理由は、操作が冪等ではなく、検索以外の副作用があるためです。見る HTTP仕様:

特に、この大会は GETとHEADが メソッドは、 行動を起こすことの意義 その他 検索よりも。これらのメソッドは、 「安全」と見なされます。これにより、ユーザーは エージェントは他のメソッドを表し、 POST、PUT、DELETEなど、 ユーザーが作られるように、特別な方法 可能性があるという事実を認識しています。 安全でないアクションが要求されています。

...

方法は、(エラーまたは有効期限の問題は別として)n> 0の副作用は、単一の要求と同じであるという点で(エラーまたは有効期限の問題を除いて)「idempotence」の特性を持つこともできます。メソッドは、このプロパティを共有し、ヘッド、配置、削除を取得します。また メソッド OPTIONS と TRACE は 副作用はありません 本質的にべき等です。

役に立ちましたか?

解決

アクションがべき等でない場合、 MUST POST を使用する必要があります。そうしないと、あなたはただトラブルを求めているだけです。 GET PUT 、および DELETE メソッドは、べき等である必要があります 。クライアントがサービスのすべての可能な GET リクエストをプリフェッチしている場合、アプリケーションで何が起こるか想像してください-これがクライアントに見える副作用を引き起こすなら、何かが間違っています。

POST にクエリ文字列を含めて本文を送信するのは奇妙に思えますが、状況によっては適切だと思います。

URLのクエリ部分を、リソースへのコマンドとして考えて、現在の要求の範囲を制限します。通常、クエリ文字列は GET リクエスト(?page = 1& sort = title など)の並べ替えまたはフィルタリングに使用されますが、 POSTで意味があると思われますもスコープを制限します(?action = delete& id = 5 など)。

他のヒント

誰もが正しい:べき等でない要求にはPOSTを使い続ける。

URIクエリ文字列とリクエストコンテンツの両方を使用するのはどうですか?有効なHTTPです(注1を参照)ので、なぜそうではありません!

これも完全に論理的です。クエリ文字列部分を含むURLは、リソースを検索するためのものです。一方、HTTPメソッドの動詞(POST-およびオプションのリクエストコンテンツ)は、アクション、またはリソースの処理を指定するためのものです。それらは直交する懸念であるべきです。 (ただし、ContentType = application / x-www-form-urlencodedの特殊なケースでは、これらは美しく直交する問題ではありません。以下の注2を参照してください。)

注1:HTTP仕様(1.1)では、POSTまたはPUT要求を受け入れるHTTPサーバーに対して、クエリパラメーターとコンテンツが相互に排他的であるとは規定していません。したがって、どのサーバーでも両方を自由に受け入れることができます。つまりサーバーを記述する場合、両方を受け入れることを止めることは何もありません(柔軟性のないフレームワークを除く)。一般的に、サーバーは必要なルールに従ってクエリ文字列を解釈できます。 Content-Typeなどの他のヘッダーも参照する条件付きロジックでそれらを解釈することもできます。これにより、注2:になります。

注2:ユーザーがWebアプリケーションにアクセスする主な方法が Webブラウザーであり、 application / x-www-form-urlencoded がContent-Typeである場合それらが投稿されている場合は、そのコンテンツタイプのルールに従う必要があります 。そして、application / x-www-form-urlencodedのルールは、より具体的です(率直に言って、珍しい):この場合、URIをリソースの場所ではなくパラメーターのセットとして解釈する必要があります。 [これはPowerlordが提起した有用性と同じポイントです。 Webフォームを使用してコンテンツをサーバーにPOSTするのが難しい場合があります。説明が少し異なります。]

注3:元々クエリ文字列は何ですか? RFC 3986では、HTTPクエリ文字列を、リソースを特定する非階層的な方法として機能するURI部分として定義しています。

この質問をしている読者が、良いRESTfulアーキテクチャとは何かを尋ねたい場合、RESTfulアーキテクチャパターンは、特定の方法で機能するURIスキームを必要としません。 RESTfulアーキテクチャは、リソースのキャッシュ可能性、リソース自体の設計(それらの動作、機能、表現)、およびべき等性が満たされるかどうかなど、システムの他のプロパティに関係します。または、言い換えると、HTTPプロトコルとそのHTTPメソッド動詞のセットとの互換性が高い設計を実現します。 :-)(つまり、RESTfulアーキテクチャは、リソースがどのように配置されるかについてあまり予測的ではありません。)

最後の注意:クエリパラメーターは、リソースの検索やコンテンツのエンコードではない、さらに別のことに使用される場合があります。 「PUT = true」や「POST = true」などのクエリパラメータを見たことがありますか?これらは、PUTおよびPOSTメソッドの使用を許可しないブラウザの回避策です。このようなパラメータはURLクエリ文字列の一部として(ワイヤ上で)表示されますが、それらはURLのクエリの一部ではない in spirit

理由が欲しいですか?ここにその 1 つがあります:

Web フォームを使用して、GET と POST を組み合わせて使用​​するページにリクエストを送信することはできません。フォームのメソッドを GET に設定すると、すべてのパラメータがクエリ文字列に含まれます。フォームのメソッドを POST に設定すると、すべてのパラメータがリクエスト本文に含まれます。

ソース:HTML 4.01 標準、セクション 17.13 フォームの送信

プログラムの観点から、クライアントの場合、パラメーターをパッケージ化し、URLに追加して、POSTとGETを実行します。サーバー側では、ポストされたバイトではなく、クエリ文字列からの受信パラメーターを評価しています。基本的に、それは洗浄です。

特定のクライアントプラットフォームがネットワーキングスタックでPOSTルーチンとGETルーチンを処理する方法、およびWebサーバーがそれらの要求を処理する方法に長所/短所がある場合があります。実装によっては、一方のアプローチが他方のアプローチよりも効率的である場合があります。それを知っていると、ここでの決定に役立ちます。

それでも、プログラマーの観点から、本文のすべてのパラメーターを使用したPOST、またはURLのすべてのパラメーターを使用したGETを許可し、POST要求でurlパラメーターを明示的に無視することを好みます。混乱を避けます。

コンテンツペイロードをPOST本体に限定したまま、URL上のリソースを識別するクエリ引数を持つことは、まだRESTfulであると思います。これにより、「送信するもの」の考慮事項が分離されるように思われます。対"私はそれを誰に送信しますか?"。

REST キャンプには、使用方法を標準化するために使用できるいくつかの指針がありますHTTP動詞。これは、RESTful APIを作成するときに役立ちます。

一言で言えば: GETは読み取り専用にする必要があります。つまり、サーバーの状態には影響しません。 POSTは、サーバー上でリソースを作成するために使用されます。 PUTは、リソースの更新または作成に使用されます。 DELETEは、リソースを削除するために使用されます。

つまり、APIアクションがサーバーの状態を変更する場合、RESTはGETではなくPOST / PUT / DELETEを使用することを推奨します。

ユーザーエージェントは通常、複数のPOSTを行うことは悪いことであり、POSTの目的はサーバーの状態を変更すること(たとえば、チェックアウト時に商品の代金を支払う)であり、おそらく2回はやりたくないため、警告することを理解しています!

好きなように頻繁に実行できるGETと比較します(べき等)。

同意します。本文ではなくURLでデータを渡すだけの場合は、おそらくGETリクエストを使用する方が安全です。の追加のビューについては、同様の質問をご覧くださいPOST + GETの概念全体。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top