web-dev-qa-db-ja.com

REST DELETEは本当にべき等ですか?

DELETEはべき等であることになっています。

DELETE http://example.com/account/12 を削除すると、アカウントが削除されます。

アカウントがもう存在しないので、私が再びそれを行うと、404が予想されますか?存在したことのないアカウントを削除しようとしたらどうなりますか?

146
Ben Noland

Dem等とは、リクエストが完了した後のシステムの状態を指します


すべての場合(エラーの問題を除く-以下を参照)、アカウントはもう存在しません。

ここ から

「メソッドは、「エラーまたは有効期限の問題を除く)」という「idempotence」のプロパティを持つこともできます。N> 0の同一リクエストの副作用は単一のリクエストの場合と同じです。GET、HEAD、PUT、およびDELETEメソッドはこのプロパティを共有します。また、OPTIONSメソッドとTRACEメソッドには副作用がないため、本質的にi等です。


そこにあるキービットは n> 0の同一リクエストの副作用は、単一リクエストの場合と同じです。

ステータスコードが異なることを期待するのは正しいでしょうが、これは影響しません べき等性のコアコンセプト-サーバーの状態をさらに変更することなく、リクエストを複数回送信できます。

173
Chris McCauley

べき等は要求の効果に関するものであり、取得する応答コードに関するものではありません。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2 言います:

メソッドは、(エラーまたは有効期限の問題を除いて)N> 0の同一リクエストの副作用が単一リクエストの場合と同じであるという点で、「べき等性」のプロパティを持つこともできます。

異なる応答コードを受け取る場合がありますが、同じリソースにN + 1 DELETE要求を送信するeffectは同じと見なすことができます。

41
Bruno

HTTP RFC から:

メソッドは、(エラーまたは有効期限の問題を除いて)N> 0の同一リクエストの副作用が単一リクエストの場合と同じであるという点で、「べき等性」のプロパティを持つこともできます。

「応答」ではなく「副作用」であることに注意してください。

7
fumanchu

重要な違いは、i等性が副作用であり、all-効果または応答ではないことです。 DELETE http://example.com/account/123その後、アカウント123がサーバーから削除されるようになります。これが唯一の効果であり、サーバーの状態に対する唯一のchangeです。次に、同じDELETE http://example.com/account/123再度要求すると、サーバーは異なる応答をしますが、その状態は同じです。

別のアカウントを削除したり、エラーログを残したりするなど、アカウントが見つからなかったため、DELETEリクエストがサーバーの状態を別の方法で変更することを決定したのとは異なります。いや、同じDELETE要求を100万回呼び出すことができ、サーバーが最初に呼び出したときと同じ状態にあることを確認できます

6
Janac Meena

はい。応答コードに関係なく。

HTTP 1.1の最新のRFC (私の強調):

クライアントがサーバーの応答を読み取る前に通信障害が発生した場合、要求を自動的に繰り返すことができるため、べき等メソッドは区別されます。たとえば、クライアントがPUT要求を送信し、応答を受信する前に基礎となる接続が閉じられた場合、クライアントは新しい接続を確立してべき等要求を再試行できます。元のリクエストが成功した場合でも、リクエストを繰り返すことで同じ効果が得られることがわかっています。ただし、レスポンスは異なる場合があります。

応答が異なる可能性があることを明示的に示しています。さらに重要なことは、コンセプトの理由を示しています。アクションがべき等である場合、クライアントはエラーが発生したときにアクションを繰り返し、クラッシュしても何もクラッシュしないことを知っています。そうでない場合、クライアントは追加のクエリ(おそらくGET)を作成して、前のクエリが有効かどうかを確認してから、アクションを安全に繰り返します。サーバーがそのような保証を行うことができる限り、アクションはi等です。 別のコメント からの引用:

べき等性の計算は、システムの堅牢性に関するものです。物事は失敗する可能性があるため(ネットワークの停止など)、失敗が検出された場合、どのように回復しますか?最も簡単な回復方法は、もう一度実行することですが、それを再度実行することがdem等である場合にのみ機能します。例えば。 discard(x)はi等ですが、pop()はそうではありません。エラーリカバリがすべてです。

3
Franklin Yu

404-アカウントは存在しません。

あなたは400-悪いリクエストを主張することができます。ただし、RESTの意味では、アクションの実行を要求したオブジェクトは存在しません。これは404に変換されます。

2
Jason McCreary