【发布时间】:2012-10-18 23:27:31
【问题描述】:
所以 HTTP 规范说 HTTP PUT 和 DELETE 应该是幂等的。这意味着,对具有相同正文的相同 URL 的多个 PUT 请求不应在服务器上产生额外的副作用。多个 HTTP DELETE 也是如此,如果将 2 个或多个 DELETE 请求发送到同一个 URL,则第二个(或第三个等)请求不应返回指示资源已被删除的错误。
但是,在处理完 DELETE 之后对 URI 的 PUT 请求会怎样呢?它应该返回 404 吗?
例如,考虑以下请求按此顺序执行:
- POST /api/items - 创建
item资源,返回 HTTP 201 和 URI /api/items/6 - PUT /api/items/6 - 更新与
item#6 关联的数据 - PUT /api/items/6 - 只要请求正文与之前的 PUT 相同,就没有副作用
- DELETE /api/items/6 - 删除
item#6 并返回 HTTP 202 - DELETE /api/items/6 - 没有副作用,还返回 HTTP 202
- GET /api/items/6 - 现在将返回 404
- PUT /api/items/6 - 这里应该发生什么? 404? 409?还有什么?
那么,PUT 是否应该与 get 一致并返回 404,或者像 @CodeCaster 建议的那样,409 是否更合适?
【问题讨论】:
-
您的问题具有误导性。只要资源确实不再存在,第二个 DELETE 返回什么实际上并不重要。
-
@JulianReschke,真的吗?那么第一个DELETE可以返回200、202还是204,第二个delete可以返回404呢?那么这篇文章的底部是否具有误导性? asp.net/web-api/overview/creating-web-apis/… "因此,如果产品已被删除,该方法不应返回错误代码。"
-
是的,那篇文章具有误导性。就幂等性而言,这真的无关紧要。
-
从第二个 DELETE 返回 404 对我来说更有意义。
-
您的问题应明确说明在给定 URI 上禁止 PUT 的愿望是您的特定限制。 RFC2616 中没有任何内容不允许这样做。这是您的应用程序协议中的设计选择。
标签: api http rest asp.net-web-api