REST API 中不存在的资源的适当 HTTP 状态代码?

appropriate HTTP status code for non-existent resources in REST API?

提问人:amphi 提问时间:11/14/2023 更新时间:11/14/2023 访问量:33

问:

我正在设计一个 REST API 服务器应用程序,试图在资源不存在时为服务器响应建立规则。虽然我们可以在团队中定义内部代码,但关于 HTTP 状态代码存在争议。

考虑端点 POST /a (body: { “bid”: 123 })。此终结点用于创建用户拥有的“a”资源。在创建过程中,需要“b”资源,因此“b”的 id 作为有效负载包含在正文中。但是,如果“b”中没有 id=123 的资源,则是否应将其视为 404 Not Found?

我将不胜感激您从REST原则和约定中获得的见解。如果您能提供对 RFC 等官方文档的引用,那就更好了。

目前我选择了 404 未找到。但我的团队说这是错误的。什么是正确的?

休息 http-status-codes

评论


答:

1赞 VoiceOfUnreason 11/14/2023 #1

但是,如果“b”中没有 id=123 的资源,则是否应将其视为 404 Not Found?

可能不是。

关键思想:HTTP 状态代码是 transfer-documents-over-a-network 域的元数据,它们用于描述对通用组件(浏览器、代理等)的响应性质,以便这些组件可以做有趣的事情。


在您描述的情况下,请求中肯定存在问题,因此一些 4xx 客户端错误是合适的。

但是,404 表示目标资源没有当前表示形式。目标资源是由请求行中的请求目标标识的资源

简单地说,发送 404 响应意味着 HTTP 请求在所请求资源的 URI 中存在拼写错误。

在您的示例中:

POST /a HTTP/1.1

目标资源是由 标识的资源。消息的这一部分是正确的:请求目标的拼写确实与请求处理器的标识符匹配;因此,404 的响应具有误导性。/a

您想要的是涉及请求正文已注册状态代码之一,而不是请求目标

422 不可处理的内容更适合。

评论

0赞 amphi 11/14/2023
谢谢。这很清楚。youtube、RFC 文档和您的建议将非常有帮助