PUTting只读实体的适当HTTP状态

aaa*_*dan 6 rest api-design http-status-codes

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

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

客户可能不知道货物已经发送,因此客户端不是"粗心"错误.

400似乎不合适,因为输入格式正确且语法正确.
405看起来很合适.在这种情况下,这是一个常见的回应吗?
403似乎暗示授权已被撤销,这可能会产生误导.
422似乎很合适,但如果你不提供WebDAV功能(我们不提供),它的使用似乎是不鼓励的.
500听起来好像有人绊倒了电缆,虽然我听说有些开发人员/框架在这种情况下使用这种状态.

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

spe*_*ras 7

我会看看405 Method Not Allowed。它是这样定义的:

405 (Method Not Allowed) 状态码表示在请求行中接收到的方法被源服务器知道但不被目标资源支持。源服务器必须在 405 响应中生成一个 Allow 头字段,其中包含目标资源当前支持的方法列表。

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

作为额外的奖励,默认情况下 405 响应是可缓存的,这在您的情况下可能有意义。


另一个可行的选择是409 Conflict

409(冲突)状态码表示由于与目标资源的当前状态冲突,请求无法完成。

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

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

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