已禁用资源上的操作的预期HTTP状态代码

时间:2016-04-26 19:39:49

标签: rest http api-design

对于给定以下内容的操作,预期/正确的HTTP状态代码是什么:

  • 请求语法正确(取消400
  • 用户已通过身份验证(已取消401
  • 授权用户执行操作(取消403
  • 位置/资源存在(消除404
  • 方法已实施(取消501
  • 没有服务器错误(消除5xx

资源当前已被禁用,从而阻止操作以预期结果完成。用户可以更改资源的状态并重试相同的请求。关于资源无法满足要求的原因的信息将包括在答复机构中。

我的想法是409 Conflict将是最好的响应,因为用户可能会更改资源的状态并重新提交请求,但也许有更好的东西来指示&# 34;此方法通常是您允许的,但资源当前处于阻止其按预期完成的状态。"

3 个答案:

答案 0 :(得分:2)

这似乎是互联网的共识,我没有看到更好的hereSee here for another similar question

<强> 409

  

此代码用于用户可能的情况      能够解决冲突并重新提交请求。   Source

然后跟进

  

最有可能发生冲突以响应PUT请求。对于      如果正在使用版本控制并且表示正在使用      PUT包括对与之相冲突的资源的更改      较早的(第三方)请求

这似乎更像是在客户端构建一个调用时在客户端下移动的实体,也许假设是客户端在进行调用之前要求允许的操作。如果您实现了这一点,我会说409对您的API完全有效,因为您为客户提供了有效请求的能力,除非其他人更改了实体。

显然,您应该保持一致,并记录响应代码及其用法。

答案 1 :(得分:0)

409似乎最合适,这是http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html所说的: '此代码仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许。响应主体应该包含足够的信息供用户识别冲突的来源。理想情况下,响应实体将包含足够的信息供用户或用户代理解决问题;但是,这可能是不可能的,也不是必需的。'

答案 2 :(得分:0)

根据RFC 4918(https://tools.ietf.org/html/rfc4918#section-11.2),您可以使用代码422(不可处理实体)来处理类似情况。

422无法处理的实体

422(不可处理实体)状态代码表示服务器
了解请求实体的内容类型(因此,
415(不受支持的媒体类型)状态码不正确),并且
请求实体的语法正确(因此为400(错误请求)
状态代码不正确),但无法处理其中的内容 说明。例如,如果XML
,则可能会发生此错误情况 请求正文包含格式正确(即语法正确)的内容,但
语义错误的XML指令。