【发布时间】:2019-01-30 03:49:15
【问题描述】:
我正在尝试在我们的软件中实现一些 PATCH 请求(遵循https://www.rfc-editor.org/rfc/rfc7396)。资源有一些不能修改的字段,所以我想当这些字段出现在 HTTP JSON 请求正文中时返回一些错误状态代码。 400 似乎有点太笼统了(我将它用于验证错误,例如电子邮件格式等)。也许在这种情况下还使用了其他一些状态码?
【问题讨论】:
我正在尝试在我们的软件中实现一些 PATCH 请求(遵循https://www.rfc-editor.org/rfc/rfc7396)。资源有一些不能修改的字段,所以我想当这些字段出现在 HTTP JSON 请求正文中时返回一些错误状态代码。 400 似乎有点太笼统了(我将它用于验证错误,例如电子邮件格式等)。也许在这种情况下还使用了其他一些状态码?
【问题讨论】:
有一个代码。 . . 8-)
403 Forbidden
服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。如果请求方法不是 HEAD 并且服务器希望公开请求未完成的原因,它应该描述原因
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
此外,即使没有凭据问题,403 也是适用的。 这在RFC7231 Section 6.5.3 中有解释:
请求可能因某些原因被禁止 与凭据无关
【讨论】:
RFC 7231 section 8.2 状态码 registry,所以这是开始的地方。
这显然是请求的问题;客户可能能够修复的东西,因此 4xx 类的条目是合适的。
405 Method Not Allowed 对于您描述的情况是错误的 - 此资源将接受不同的合并补丁文档,但不是存在的那个。
403 Forbidden 错误,因为它传达了与凭据相关的问题,但您描述的是有效负载问题。
409 Conflict 可能是合理的...
由于与目标资源的当前状态冲突,请求无法完成。
我看不出有任何理由表明冲突不能处于“当前状态”的不可变部分。
但我认为你最好的选择是422 Unprocessable Entity
422(Unprocessable Entity)状态码表示服务器理解请求实体的内容类型(因此 415(Unsupported Media Type)状态码是不合适的),并且请求实体的语法是正确的(因此 400 (错误请求)状态代码不合适)但无法处理包含的指令。例如,如果 XML 请求正文包含格式正确(即语法正确)但语义错误的 XML 指令,则可能会发生这种错误情况。
另一个值得考虑的好资源是 HTTP 补丁规范。 RFC 5789 列举了补丁可能失败的许多原因,以及在每种情况下适合使用的代码。您可以自行决定这些区别是否适合您的情况。
也可能有更具体的错误,例如“冲突状态”,可以使用此状态代码发出信号,但更具体的错误通常会更有帮助。
【讨论】:
412 Precondition Failed 将是有意义的。