REST DELETE真的是幂等的吗?

DELETE应该是幂等的。

如果我删除http://example.com/account/123它将删除该帐户。

如果我再次这样做,我会期望一个404,因为该帐户不再存在? 如果我尝试删除一个从未存在的帐户,该怎么办?

幂等是指请求完成后系统的状态

在所有情况下(除了错误问题 – 请参阅下文),帐户不再存在。

从这里

“方法也可以具有”幂等性“的性质, 除了错误或过期问题外 ,N> 0个相同请求的副作用与单个请求的副作用相同,方法GET,HEAD,PUT和DELETE共享这个属性,另外,OPTIONS和TRACE方法不应该有副作用,所以它们本身就是幂等的。

关键的一点是,N> 0的相同请求的副作用与单个请求相同。

如果期望状态代码会有所不同,但是这不会影响幂等性核心概念 – 您可以多次发送请求,而无需对服务器的状态进行额外的更改。

幂等性是关于请求的效果,而不是关于您得到的响应代码。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2说:;

方法也可以具有“幂等性”的性质(除了错误或过期问题),N> 0个相同请求的副作用与单个请求相同。

虽然您可能会得到不同的响应代码,但是发送N + 1个DELETE请求到同一个资源的效果可以被认为是相同的。

从HTTP RFC :

方法也可以具有“幂等性”的性质(除了错误或过期问题),N> 0个相同请求的副作用与单个请求相同。

请注意,这是“副作用”,而不是“回应”。

我认为同样的事情,404 – 帐户不存在。

你可以争论400 – 坏请求。 但是就REST而言,您请求执行操作的对象不存在。 这意味着404。

重要的区别是幂等指的是副作用 ,而不是所有的影响或反应。 如果您执行DELETE http://example.com/account/123则效果是现在帐户123已从服务器中删除。 这是唯一的影响,是服务器状态的唯一改变 。 现在让我们说你再次执行相同的DELETE http://example.com/account/123请求,服务器将有不同的响应,但其状态是相同的。

它不像DELETE请求决定以不同的方式更改服务器状态,因为帐户丢失,如删除另一个帐户,或留下一个错误日志。 不, 您可以调用相同的DELETE请求一百万次,您可以确定服务器处于与第一次调用服务器时相同的状态