假设我有一个支持HTTP DELETE方法的资源(例如:/api/shipments/100
)。您可以从URI本身了解到,如果针对此URI发出DELETE请求,则将删除此资源。
在我目前的情况下,只有满足某个条件才能成功执行DELETE请求:
如果存在针对该URI的DELETE请求并且不满足上述条件,那么在这种情况下哪个HTTP状态代码更适合返回?我已经考虑过以下几个,但无法确定哪一个更具语义性:
答案 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)