web-dev-qa-db-ja.com

http DELETEを使用してリソースを削除する

したがって、HttpのDELETE動詞がべき等である場合、次の要求を発行すると、2番目(または3番目、4番目など)に何が起こるでしょうか?

DELETE /person/123

初めて、リソースが削除され、204(成功、コンテンツなし)が返されます。後続の呼び出しで204を返すか、404(見つかりません)を返す必要がありますか?

103
Craig Wilson

ステートレスシステムでのHTTPリクエストは独立している必要があるため、1つのリクエストの結果が以前のリクエストに依存してはなりません。 2人のユーザーが同じリソースに対して同時にDELETEを実行した場合にどうなるかを検討してください。 2番目のリクエストが404を取得するのは理にかなっています。1人のユーザーが2つのリクエストを行う場合も同様です。

DELETEに2つの異なる応答を返させても、you等だとは思わないでしょう。べき等のリクエストをシステムが同じ状態にあり、必ずしも同じ応答を持つとは限らないと考えると便利です。したがって、既存のリソースを削除するか、存在しないリソースを削除しようとしても、サーバーリソースの状態は同じです。

129
Darrel Miller

RESTful Webサービスクックブックは、このための優れたリソースです。偶然、 そのGoogleプレビュー 削除に関するページを表示(11ページ):

DELETEメソッドはべき等です。これは、サーバーが以前の要求でリソースを削除した場合でも、サーバーが応答コード200(OK)を返す必要があることを意味します。ただし、実際には、DELETEをべき等操作として実装するには、サーバーが削除されたすべてのリソースを追跡する必要があります。それ以外の場合、404(Not Found)を返す可能性があります。

28
yves amsellem

最初のDELETE:200または204.

後続のDELETE:200または204.

Rationalale:DELETEはべき等でなければなりません。 2番目のDELETEで404を返す場合、応答は成功コードからエラーコード。クライアントプログラムは、DELETEが失敗したという仮定に基づいて、誤ったアクションを実行する場合があります。

  • DELETE操作が、クライアントプログラムによって実行されるマルチステップ操作(または「サガ」)の一部であるとします。
  • クライアントプログラムは、たとえば銀行取引を実行するモバイルアプリです。
  • クライアントプログラムにDELETE操作の自動再試行があるとします(DELETEはべき等であるため、それは理にかなっています)。
  • 最初のDELETEが正常に実行されたが、クライアントプログラムへの途中で200応答が失われたとします。
  • クライアントプログラムはDELETEを再試行します。
  • 2回目の試行で404が返された場合、クライアントプログラムはこのエラーコードのために操作全体をキャンセルする場合があります。
  • ただし、サーバーで最初のDELETEが正常に実行されたため、システムは一貫性のない状態のままになる可能性があります
  • 2回目の試行で200または204が返された場合、クライアントプログラムは期待どおりに進みます。
10
Paulo Merson