适合用于PUT只读实体的HTTP状态

9
当客户端尝试PUT到一个当前只读的实体时,适当的HTTP响应代码是什么?
一个玩具示例是产品发货。在发货之前,可以更改详细信息(地址、产品、数量)(例如使用PUT请求)。然而,一旦发货,任何PUT都应该失败,即使请求格式和语法是正确的。
客户端可能不知道已经发货,因此这不是客户端方面的“粗心”错误。

400 不太合适,因为输入格式正确且语法正确。
405 似乎是一个好选择。在这种情况下,这是常见的响应吗?
403 似乎意味着授权已被撤销,可能会误导用户。
422 似乎很合适,但如果您不提供 WebDAV 功能,则其使用似乎受到 不鼓励(我们没有提供该功能)。
500 可能会让人觉得有人绊倒了电缆,尽管我听说一些开发者/框架在这种情况下使用此状态。

在这种情况下是否有标准做法?什么最不容易引起 API 用户(开发者)和最终用户(使用 UI 的人)的混淆?


你的列表缺少405方法不允许,看起来很适合。 - spectras
@spectras,欢迎随时在答案中添加您的建议! - aaaidan
1个回答

10
我建议查看 RFC7231 中的 405 Method Not Allowed。该代码定义如下:

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

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

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


另一个可行的选择是409 Conflict

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

可以说订单已更改状态,以一种使其不再可修改的方式进行了修改。 但请注意:

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

...因此我倾向于使用另一个状态码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接