如果客户端向不存在的Web API资源发出DELETE,应该返回什么

时间:2015-08-20 21:32:49

标签: rest http asp.net-web-api

有时客户的信息过时,可能导致他们不必要地发布

DELETE theApiURL/theEntity/1234

第一次发出此请求并且一切顺利,我们返回204

任何后续时间都没有固有的错误条件,服务器删除所标识位置的任何实体,但该实体可能不存在。因此,“删除ID为1234的实体”的操作成功完成。

我可以返回404,因为该实体不存在。

我可以返回2xx,因为请求已“成功”完成...此处可能205适合表示请求已完成,但用户应刷新其内容吗?

3 个答案:

答案 0 :(得分:2)

我觉得尝试删除一些不存在的东西是客户端错误。我认为404在这种情况下并不正确,因为找到了DELETE请求并确实有效。

410 GONE对我有意义。该实体已被删除且为GONE,客户可以删除该链接。

我认为使用410的原因是此子句:If the server does not know, or has no facility to determine, whether or not the condition is permanent, the status code 404 (Not Found) SHOULD be used instead.我们可以确定并知道该实体已被删除并永远消失(除非您重复使用ID)。

答案 1 :(得分:1)

我会回复404。

除非您知道该资源在某个时刻存在并且想要告知消费者,否则410似乎是合适的。但如果您没有检查资源是否存在,则默认为410似乎是错误的。

答案 2 :(得分:1)

根据RFC 2616:

  

10.4.5 404 Not Found

     

服务器未找到与Request-URI匹配的任何内容。没有说明该病症是暂时的还是永久性的。 如果服务器通过一些内部可配置的机制知道旧资源永久不可用且没有转发地址,则应该使用410(Gone)状态代码。此状态代码通常用于服务器不希望确切地说明请求被拒绝的原因,或者没有其他适用的回应。

     

...

     

10.4.11 410 Gone

     

服务器上不再提供所请求的资源,并且不知道转发地址。预计这种情况将被视为永久性的。具有链接编辑功能的客户端应该在用户批准后删除对Request-URI的引用。 如果服务器不知道或无法确定条件是否是永久性的,则应该使用状态代码404(未找到)。除非另有说明,否则此响应是可缓存的。

     

410响应主要用于通过通知收件人资源有意不可用以及服务器所有者希望删除到该资源的远程链接来协助Web维护任务。这种事件对于限时,促销服务以及属于不再在服务器站点工作的个人的资源是常见的。 没有必要将所有永久不可用的资源标记为"已消失"或者将标记保留一段时间 - 由服务器所有者自行决定

因此,在初始DELETE成功后,如果服务器知道资源一旦存在,则对资源的任何后续请求都应返回410,否则返回404。