由于特殊原因不允许DELETE操作时返回哪个HTTP状态代码

问题描述:

假设我有一个支持HTTP DELETE方法的资源(例如:/api/shipments/100)。正如你从URI本身可以理解的那样,如果对这个URI做出DELETE请求,这个资源将被删除。由于特殊原因不允许DELETE操作时返回哪个HTTP状态代码

  • 如果装载状态未设置为在途或交付:

    在我目前的情况下,删除请求只能成功,如果一定条件如下满足执行。

如果存在针对该URI和上述条件一个DELETE请求不被满足,其中HTTP状态代码将是更适当的在这种情况下,返回?我曾经想过以下的人,但不能决定哪一个更语义:

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

我会409: Conflict,因为你有什么是资源状态的违规。

405: Method Not Allowed也可以工作。如果您想使用405,则必须发送一个Allow标题来指示支持的方法,并且支持的方法会因资源状态而异。在我看来,这个响应代码非常适合只读资源,无法删除的资源等,但Darrel对本文的评论有效。该规范是模棱两可:

在Request-Line中指定的方法是不允许由请求URI标识的 资源。响应必须包含一个 允许标题,其中包含请求的 资源的有效方法列表。

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


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

403: Forbidden时,应使用不具有相应的权限修改的资源,也就是说,如果你要成为一个管理员删除该资源,你不是。

412: Precondition Failed主要用于条件请求,其中前提条件在请求标头中明确指定。例如,只有当If-Match标题有效时,才可以执行条件PUT请求。如果你没有在请求头中指定什么,我还是会选择在409 412下面是412规格:

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

+0

你有没有针对405的参数的引用?你怎么能说资源永远不会支持某种特定的方法?我没有看到支持的方法随时间而改变的问题。 –

+0

请参阅我的编辑。 –

+0

另外,如果你看一下允许头的定义,它包括注释'允许的方法的实际集合是在每个请求时由原始服务器定义的“这意味着这组方法”允许“预计会改变,而405则反映了目前的状况。 http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-18#section-9.1 –

我会使用412:先决条件失败。

请参见本为HTTP状态代码

Web Status Codes

+0

但它表示“在一个或多个**请求头字段**中给出的先决条件**在服务器上测试时评估为false”,在我看来这不会是语义的。 – tugberk

+0

我同意,请参阅我的更新。 –