Cra*_*son 109 rest http http-delete
因此,假设Http中的DELETE谓词是幂等的,当我发出以下请求时,第二个(或第三个,或第四个,等等)会发生什么?
DELETE /person/123
Run Code Online (Sandbox Code Playgroud)
第一次,资源被删除,我返回204(成功,没有内容).我应该在后续电话或404(未找到)上返回204吗?
Dar*_*ler 136
作为一个无状态的系统的HTTP请求应该是独立的,一个请求的结果不应该依赖于先前的请求.考虑如果两个用户同时在同一资源上执行DELETE会发生什么.获取404的第二个请求是有意义的.如果一个用户发出两个请求,则同样应该如此.
我猜测让DELETE返回两个不同的响应对你来说并不是幂等的.我认为将幂等请求视为离开系统处于相同状态,而不一定具有相同的响应是有用的.因此,无论您是删除现有资源,还是尝试删除不存在的资源,服务器资源状态都是相同的.
Ray*_*Luo 42
我同意当前选择的答案所说的,即第二个(以及第三个、第四个……) DELETE 应该得到 404。而且,我注意到答案有 143 票赞成,但也有相反的评论,有 54 票赞成,因此社区以大约 3:1 的比例分为 2 个阵营。这里有更多信息来解决这场长期的争论。
首先,让我们不要从“我”的想法、“你”的想法或另一本书作者的想法开始。让我们从 HTTP 规范开始,即 RFC 7231。
DELETE /some/resource/which/does/not/exist应该导致 404。然后,DELETE /some/resource/which/happened/to/be/removed/by/someone/else/five/days/ago也可能返回 404那么,为什么要DELETE /some/resource/i/deleted/five/seconds/ago有所不同呢?“但是幂等性怎么样?!”,我可以听到你在尖叫。等一下,我们马上就要开始了。从历史上看,1999 年发布的 RFC 2616 是引用最多的 HTTP 1.1 规范。不幸的是,它对幂等性的描述是模糊的,这为所有这些争论留下了空间。但该规范已被RFC 7231取代。引自RFC 7231, section 4.2.2 Idempotent Methods,强调我的:
如果使用该方法的多个相同请求对服务器的预期效果与单个此类请求的效果相同,则该请求方法被认为是“幂等的”。 在本规范定义的请求方法中,PUT、DELETE和安全请求方法 是幂等的。
所以,它写在规范中,幂等性是关于对服务器的影响。第一个 DELETE 返回 204,然后随后的 DELETE 返回 404,这种不同的状态代码不会使 DELETE 非幂等。使用这个论点来证明随后的 204 返回是完全不相关的。
好的,所以这与幂等性无关。但是接下来的一个问题可能是,如果我们在后续的DELETE中仍然选择使用204呢?可以吗?
好问题。动机是可以理解的:允许客户端仍然达到预期的结果,而不必担心错误处理。我会说,在随后的 DELETE 中返回 204,在很大程度上是无害的服务器端“善意的谎言”,客户端不会立即分辨出区别。这就是为什么有大约 25% 的人在野外这样做并且它似乎仍然有效。请记住,这种谎言在语义上可以被认为是奇怪的,因为GET /non-exist返回 404 但DELETE /non-exist给出 204,此时客户端会发现您的服务不完全符合第 6.5.4 节 404 Not Found。
但我想指出,RFC 7231 暗示的预期方式,即在随后的 DELETE 中返回 404,首先不应该成为问题。3 倍以上的开发人员选择这样做,您是否听说过由于客户端无法处理 404 导致的重大事件或抱怨?大概,不,那是因为,任何实现 HTTP DELETE(或任何 HTTP 方法,就此而言)的体面的客户端都不会盲目地假设结果总是成功 2xx。然后,一旦开发人员开始考虑错误处理,404 Not Found 将是第一个想到的错误之一。那时,他/她可能会得出结论,HTTP DELETE 操作忽略 404 错误在语义上是安全的。他们这样做了。
问题解决了。
yve*_*lem 29
RESTful Web服务手册是一个很好的资源.偶然的机会,它的谷歌预览显示关于DELETE的页面(第11页):
DELETE方法是幂等的.这意味着即使服务器在先前的请求中删除了资源,服务器也必须返回响应代码200(OK).但实际上,将DELETE实现为幂等操作需要服务器跟踪所有已删除的资源.否则,它可以返回404(未找到).
Pau*_*son 12
首先删除:200或204.
随后的DELETE:200或204.
理由:DELETE应该是幂等的.如果您在第二个DELETE上返回404,则您的响应将从成功代码更改为错误代码.客户端程序可能会根据DELETE失败的假设采取不正确的操作.
示例:
| 归档时间: |
|
| 查看次数: |
55286 次 |
| 最近记录: |