使用http DELETE删除资源

所以,鉴于Http中的DELETE动词是幂等的,当我发出以下请求时,第二个(或第三个或第四个等等)会发生什么?

DELETE /person/123 

第一次,资源被删除,我返回一个204(成功,没有内容)。 我应该在随后的电话或404(未find)返回204?

由于无状态系统中的HTTP请求应该是独立的,一个请求的结果不应该依赖于先前的请求。 考虑如果两个用户同时在同一资源上执行DELETE,会发生什么情况。 第二个请求获得404是有意义的。如果一个用户发出两个请求,则应该是这样。

我猜测有DELETE返回两个不同的答复不觉得幂等给你。 我觉得把幂等请求看作是让系统处于相同的状态是有用的,不一定有相同的响应。 所以,无论您是否删除现有资源,或尝试删除不存在的资源,服务器资源状态都是相同的。

REST风格的Web服务食谱是一个很好的资源。 偶然, 它的谷歌预览显示关于DELETE的页面(第11页):

DELETE方法是幂等的。 这意味着即使服务器在先前的请求中删除了资源,服务器也必须返回响应代码200(OK)。 但实际上,将DELETE实现为幂等操作需要服务器跟踪所有已删除的资源。 否则,它可以返回一个404(Not Found)。

首先删除 :200或204。

随后删除 :200或204。

理由 :DELETE应该是幂等的。 如果您在第二个DELETE上返回404,则您的响应将从成功代码更改为错误代码 。 客户端程序可能会根据DELETE失败的假设采取不正确的操作。

例如

  • 假设你的DELETE操作是由客户端程序执行的多步操作(或“传奇”)的一部分。
  • 例如,客户端程序可以是执行银行交易的移动应用程序。
  • 假设客户端程序有一个DELETE操作的自动重试(这是有道理的,因为DELETE应该是幂等的)。
  • 比方说,第一个DELETE成功执行,但200响应在客户端程序的途中丢失了。
  • 客户端程序将重试DELETE。
  • 如果第二次尝试返回404,则由于此错误代码,客户端程序可能会取消整体操作。
  • 但是,由于第一个DELETE在服务器上成功执行, 系统可能会处于不一致的状态
  • 如果第二次尝试返回200或204,则客户端程序将按预期进行。