当路径参数 ID 与请求正文 ID 不同时 PUT 的 HTTP 状态代码

Http status code for PUT when path parameter ID is different than request body ID

我正在使用 put 修改资源。我想知道当路径中给定的 id 与给资源正文的 id 不同时 return 的适当状态代码是什么。

例如

REST api动作方法为:/resources/{id}

正文:

{
    "id": "test",
    "name": "my_resource"
}

什么 HTTP 状态代码应该 returned 到以下 curl 请求?

curl -X PUT 'localhost:8080/resources/test2' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": "test",
    "name": "my_resource"
}'

你或许可以为

中的任何一个提出论据
  • 403 Forbidden(我明白你的要求,我拒绝履行它-详情见回复正文)
  • 409 冲突(您提议的更改与资源的当前状态冲突 - 有关详细信息,请参阅响应正文)
  • 422 无法处理的内容(您的请求正文在内部是一致的,但在这里没有意义 - 有关详细信息,请参阅响应正文)。

对于 HTTP 应用程序本身的通用元素,您选择其中的哪一个并不重要 - 它们都是不可缓存的错误,该组件不会有任何类型的自动恢复等

您可能会考虑的一个决胜局是这些条目将如何出现在您的访问日志中/您的自动监控将如何处理它们:如果您希望这些消息在您的日志中脱颖而出,那么您将想选择没有其他含义的状态码。

有关详细信息,请参阅部分 15.5 of HTTP Semantics

Do you think that a 500 Internal Server Error with a proper explanation would be fine as well or is it confusing?

当请求中的信息是问题的根源时,5xx 服务器错误是不合适的,因为请求的形式是客户端的责任,而不是服务器的责任。

粗略地说:4xx 涵盖了服务器宣布“你不应该要求那个”的所有情况。 5xx 表示“您要求的很好,但我做不到。”

参见 HTTP Semantics spec, in particular sections 15.5 and 15.6 (or, if you prefer the earlier reference, RFC 7231 6.5 and 6.6)