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

tug*_*erk 16 http http-status-codes http-delete asp.net-web-api

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

在我当前的场景中,只有满足某个条件,才能成功执行DELETE请求,如下所示:

  • 如果装运状态未设置为InTransit或已交付.

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

  • 405方法不允许
  • 403禁止
  • 409冲突

Ale*_*ian 18

我会去409: Conflict,因为你所拥有的是对资源状态的违反.

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

请求行中指定的方法不允许由Request-URI标识的资源.响应必须包含一个Allow标头,其中包含所请求资源的有效方法列表.

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


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

403: Forbidden 如果您没有相应的权限来修改资源,则应该使用,即如果您必须是管理员才能删除该资源而您不是.

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

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

  • 你赢了:-) Henrik投票给了409.这对我来说足够权威.https://twitter.com/frystyk/status/260383955486912512 (3认同)