PUTting只读实体的适当HTTP状态

时间:2017-08-29 00:25:32

标签: rest http-status-codes api-design

当客户端尝试PUT当前只读性的实体时,适当的HTTP响应代码是什么?

玩具示例是产品装运。在发送货件之前,可以更改详细信息(地址,产品,数量)(例如,使用PUT请求)。但是,一旦发送货件,即使请求格式和语法正确,任何PUT都应该失败。

客户可能不知道货物已经发送,所以它不是"粗心的""客户端的错误。

400似乎不合适,因为输入格式正确且语法正确。
405似乎很合适。在这种情况下,这是一个常见的反应吗? 403似乎暗示授权已被撤销,这可能会产生误导 422似乎很合适,但它的使用似乎discouraged if you don't provide WebDAV capabilities(我们不会这样做)。
500听起来像有人在电缆上绊了一下,虽然我听说有些开发人员/框架在这种情况下会使用这种状态。

这种情况有标准做法吗?什么最不可能导致API用户(开发人员)和最终用户(使用UI的人)混淆?

1 个答案:

答案 0 :(得分:4)

我会看405 Method Not Allowed。它的定义如下:

  

405(Method Not Allowed)状态代码表示该方法   请求行中收到的信息由原始服务器知道但不是   目标资源支持。原始服务器必须生成一个   允许405响应中的头字段包含目标列表   资源目前支持的方法。

您的服务器完全理解请求,但它不再支持写入。此外,要求返回客户端支持的方法列表听起来很干净。

作为一个额外的好处,405响应默认是可缓存的,这在你的情况下是有意义的。

另一个可行的替代方案是409 Conflict

  

409(冲突)状态代码表示请求不能   由于与目标的当前状态发生冲突而完成   资源。

可以说订单改变了状态,以这种方式修改它不再可能。但请注意:

  

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

...所以我倾向于另一个。