1. ホーム
  2. rest

[解決済み] URLクエリパラメータを含むHTTP POST -- 良いアイデアかどうか?

2022-03-19 05:06:25

質問

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

考慮すること

  • 優れたウェブデザインでは、べき等でないアクションは POST で送信される必要があります。これはべき等でないアクションです。
  • URLにリクエストパラメーターがあると、このアプリの開発・デバッグがしやすくなります。
  • 本APIは、広く利用されることを意図したものではありません。
  • ボディを持たないPOSTリクエストを行うには、もう少し手間がかかるようで、例えば Content-Length: 0 ヘッダを明示的に追加する必要があります。
  • また、ボディを持たないPOSTは、ほとんどの開発者やHTTPフレームワークの期待に少し反しているように思います。

POSTリクエストのパラメータをリクエストボディではなくURLクエリで送信することに、さらなる落とし穴や利点があるのでしょうか?

編集部:検討中の理由は、演算がべき乗でなく、検索以外の副作用があるためです。以下を参照してください。 HTTPの仕様 :

特に、慣習として GET と HEAD メソッドを持つべきではありません(SHOULD NOT)。 以外の動作をさせるという意味を持つ を取得することである。これらのメソッドは は安全であると考えられています。これにより、ユーザー エージェントは、他のメソッドを表現することができます。 POST、PUT、DELETEなど。 特別な方法で、ユーザーに 可能性があることを認識する。 安全でないアクションが要求されています。

...

また、メソッドは は別として、(quot;idempotence")。 エラーまたは期限切れの問題) N > 0 個の同一の は1つのリクエストと同じです。 リクエストに対応します。メソッドGET, HEAD, PUT とDELETEはこの性質を共有しています。また OPTIONS および TRACE メソッドは 副作用がないため は本質的にべき乗である。

解決方法は?

アクションがべき乗でない場合 マスト 使用 POST . そうでなければ、この先トラブルを招くだけです。 GET , PUTDELETE メソッドは 必須 はべき乗でなければなりません。 もし、クライアントがあらゆる可能性のある GET もしこれがクライアントに見える副作用を引き起こすのであれば、何かが間違っています。

を送信することに同意します。 POST クエリ文字列を含むがボディがないのは奇妙に思えますが、状況によっては適切な場合もあると思います。

URLのクエリ部分は、現在のリクエストの範囲を限定するためのリソースへのコマンドだと考えてください。 一般的に、クエリ文字列は GET リクエスト(例えば ?page=1&sort=title を使用することに意味があるのでしょう。 POST のように)スコープを制限することもできます。 ?action=delete&id=5 ).