当客户端尝试PUT
到当前只读性的实体时,适当的HTTP响应代码是什么?
玩具示例是产品装运。在发送货件之前,可以更改详细信息(地址,产品,数量)(例如,使用PUT
请求)。但是,一旦发送货件,即使请求格式和语法正确,任何PUT
都应该失败。
客户可能不知道货物已经发送,所以它不是"粗心的""客户端的错误。
400
似乎不合适,因为输入格式正确且语法正确。
405
似乎很合适。在这种情况下,这是一个常见的反应吗?
403
似乎暗示授权已被撤销,这可能会产生误导
422
似乎很合适,但它的使用似乎discouraged if you don't provide WebDAV capabilities(我们不会这样做)。
500
听起来像有人在电缆上绊了一下,虽然我听说有些开发人员/框架在这种情况下会使用这种状态。
这种情况有标准做法吗?什么最不可能导致API用户(开发人员)和最终用户(使用UI的人)混淆?
答案 0 :(得分:4)
我会看405 Method Not Allowed。它的定义如下:
405(Method Not Allowed)状态代码表示该方法 请求行中收到的信息由原始服务器知道但不是 目标资源支持。原始服务器必须生成一个 允许405响应中的头字段包含目标列表 资源目前支持的方法。
您的服务器完全理解请求,但它不再支持写入。此外,要求返回客户端支持的方法列表听起来很干净。
作为一个额外的好处,405响应默认是可缓存的,这在你的情况下是有意义的。
另一个可行的替代方案是409 Conflict:
409(冲突)状态代码表示请求不能 由于与目标的当前状态发生冲突而完成 资源。
可以说订单改变了状态,以这种方式修改它不再可能。但请注意:
此代码用于用户可能的情况 能够解决冲突并重新提交请求。
...所以我倾向于另一个。