1. ホーム
  2. http

[解決済み] REST、HTTP DELETEとパラメータ

2022-05-18 07:40:24

質問

HTTP DELETE リクエストにパラメータを提供することは RESTful ではないのですか?



私のシナリオは、"Are you sure you want to delete that?" シナリオをモデル化していることです。場合によっては、リソースの状態から、要求された削除が無効である可能性があることを示唆しています。削除の確認が必要ないくつかのシナリオを自分で想像できるかもしれません。

私たちが採用した解決策は、削除リクエストにパラメータを渡して、削除を続行してもよいことを示すことです ("?force_delete=true")。

DELETE http://server/resource/id?force_delete=true

から、やはりレストフルだと思います。

(a) DELETE のセマンティクスは変更されていません - ユーザーは通常の DELETE リクエストを送ることができますが、この は失敗するかもしれません。 409 で失敗する可能性があり、応答の本文でその理由が説明されます。私が失敗するかもしれないと言うのは、(説明する価値のない理由で) 場合によっては、ユーザーに促す理由がないからです。

(b) Royの論文には、それがRESTの精神に反することを示唆するものは何もありません。HTTPはRESTの1つの実装に過ぎないので、なぜHTTPパラメータを渡すことが問題になるのでしょうか?



誰か、これがRESTfulでない理由を釘付けにする決定的な文章を指し示してくれませんか?

関連した質問ですが、ユーザーがforce_deleteを指定しない場合、私は以下を返します。 409 Conflict - を返していますが、これは最も適切な応答コードでしょうか?



フォローアップ

さらに調査した結果、DELETEにパラメータを追加することは、いくつかの原則に違反する可能性があると思います。

1つ目は、その実装はおそらく "Uniform Interface" に違反しているということです (次のセクション 5.1.5 を参照してください)。 Roy の学位論文

force_delete'を追加することで、すでによく定義されているDELETEメソッドに追加の制約を追加することになります。この制約は我々にとってのみ意味があります。

また、確認ダイアログは本当にUIの問題であり、またすべてのクライアントが削除を確認したいわけではないので、それは "5.1.2 Client-Server" に違反していると主張することもできます。

どなたかご提案いただけませんか?

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

いいえ、それはRESTfulではありません。唯一の理由は、動詞を置くことです ( force_delete ) を URI に入れる唯一の理由は、PUT/DELETE メソッドが使用できない環境で GET/POST メソッドをオーバーロードする必要がある場合です。DELETEメソッドの使用から判断すると、これはそのようなケースではないでしょう。

HTTPエラーコード 409/Conflict は、RESTful サービスが操作を実行できないような競合がある場合に使用されるべきですが、ユーザーが競合を自分で解決できる可能性も残っています。削除前の確認 (削除を妨げる実際の競合がない場合) は、要求された操作を API が実行することを妨げるものがないため、それ自体は競合ではありません。

Alexが言ったように(誰が彼をdownvotedしたのか知りません。彼は正しいです)、これはUIで処理されるべきです。そのようなRESTfulサービスは単にリクエストを処理し、したがってステートレスであるべきです(すなわち、リクエストに関するサーバー側の情報を保持して確認に頼ってはいけません)。

UIでこれを行う方法の2つの例は次のとおりです。

  • HTML5以前 :* ユーザにJS確認ダイアログを表示し、ユーザが確認した場合のみリクエストを送信する。
  • HTML5 :* DELETE アクションのフォームを使用し、フォームには "Confirm" と "Cancel" ボタンしかありません ("Confirm" は送信ボタンになります)。

(*) HTML バージョン 5 より前のものは、PUT および DELETE HTTP メソッドをネイティブにサポートしていないことに注意してください。ただし、最新のブラウザのほとんどは、AJAX 呼び出しによってこれら 2 つのメソッドを実行できます。以下を参照してください。 このスレッド を参照してください。


更新 (追加調査および議論に基づき)。

サービスが必要とするシナリオは force_delete=true フラグが必要であるというシナリオは 統一インターフェース に違反します。また、以下のように HTTP RFC によると、DELETE メソッドはオリジンサーバー (クライアント) で上書きすることができ、これはターゲットサーバー (サービス) では行われないことを意味します。

したがって、サービスが DELETE リクエストを受け取ったら、(サービスが実際に操作を実行するかどうかにかかわらず)追加の確認を必要とせずに処理する必要があります。