26

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

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

  • 如果货件状态未设置为 InTransit 或 Delivered。

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

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

2 回答 2

27

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

405: Method Not Allowed也可以。如果您想使用 a 405,您必须发送一个Allow标头来指示支持的方法,并且支持的方法会因资源的状态而异。在我看来,此响应代码非常适合只读资源、无法删除的资源等,但Darrel对这篇文章的评论是有效的。规范不明确:

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

无论哪种情况,您都应该在响应正文中提供信息,以便客户端了解错误的来源。


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

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

412: Precondition Failed主要用于条件请求,其中先决条件在请求标头中明确指定。例如,您可以有条件 PUT 请求,这些请求仅应在If-Match标头有效时执行。如果您未在请求标头中指定任何内容,我仍然会选择 409 而不是 412。这是 412 的规范:

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

于 2012-10-22T13:53:20.473 回答
2

我会使用 412: Precondition Failed。

请参阅此以获取 HTTP 状态代码

网页状态码

于 2012-10-22T13:55:06.710 回答