出于特殊原因不允许执行DELETE操作时要返回的HTTP状态代码

时间:2012-10-22 13:48:39

标签: http asp.net-web-api http-status-codes http-delete

假设我有一个支持HTTP DELETE方法的资源(例如:/api/shipments/100)。您可以从URI本身了解到,如果针对此URI发出DELETE请求,则将删除此资源。

在我目前的情况下,只有满足某个条件才能成功执行DELETE请求:

  • 如果出货状态未设置为InTransit或已交付。

如果存在针对该URI的DELETE请求并且不满足上述条件,那么在这种情况下哪个HTTP状态代码更适合返回?我已经考虑过以下几个,但无法确定哪一个更具语义性:

  • 405方法不允许
  • 403 Forbidden
  • 409冲突

2 个答案:

答案 0 :(得分:17)

我会选择 409: Conflict ,因为您所拥有的是违反资源状态。

405: Method Not Allowed 也可以。如果您想使用405,则必须发送Allow标头以指示支持的方法,并且支持的方法将根据资源的状态而有所不同。在我看来,这个响应代码非常适合只读资源,无法删除的资源等,但Darrel对这篇文章的评论是有效的。规范含糊不清:

  

请求行中指定的方法不允许使用   Request-URI标识的资源。响应必须包括一个   允许包含所请求的有效方法列表的标头   资源。

在任何一种情况下,您都应该在响应正文中提供信息,以便客户了解错误的来源。


关于提到的其他两种方法:

如果您没有相应的权限来修改资源,则应使用

403: Forbidden,即如果您必须是管理员才能删除该资源而您不是。

412: Precondition Failed主要用于条件请求,其中前提条件在请求标头中明确指定。例如,您可以拥有条件PUT请求,只有在If-Match标头有效时才应执行这些请求。如果你没有在请求标题中指定任何内容,我仍然会选择409 over 412.这是412的规范:

  

一个或多个请求标头字段中给出的前提条件   在服务器上测试时评估为false。这个回应   代码允许客户端在当前资源上放置前置条件   元信息(标题字段数据),从而防止请求   方法应用于非预期资源。

答案 1 :(得分:1)

我会使用412:Precondition Failed。

请参阅此处了解HTTP状态代码

Web Status Codes