为这些响应分配的适当 HTTP 代码是什么?
两个重要的想法
首先 - 您的 API 是一个外观,旨在使您的服务/业务逻辑/等看起来只是另一个符合 HTTP 的文档存储(也称为“统一接口”约束)。出于设计您的响应的目的,您的资源的具体性质和实施细节并不重要。
第二 - 状态码的重点是通用组件(想想浏览器、网络缓存、反向代理、蜘蛛......)如何理解该状态码。我们正在尝试帮助这些组件对响应的性质进行广泛分类。 (这就是为什么 5xx 类中的代码相对较少的原因之一;如果服务器处理请求失败,通用组件可以做的改变并不多)。
事情是这样的:如果两个状态代码的通用处理没有显着不同。 403 Forbidden 和 409 Conflict 具有与之相关的不同语义,但这些代码的标准化处理差异(如果有的话)非常微妙。
您应该努力使 4xx 与 5xx 正确。准确识别要使用的 4xx 代码通常不太重要。
业务验证错误
这里的常见选择是409 Conflict(您的请求与我的数据副本不一致)或403 Forbidden(我理解您的请求,但我不会满足它)。
如果问题是请求本身中的数据(即:有人提交了错误的表单),您更有可能看到 422 Unprocessable Entity(是的,我接受 application/json,但不接受 this 应用程序/json)。
查询数据库中不存在的实体。
实现细节无关紧要;能否将问题追溯到 HTTP 请求?
如果问题追溯到 URI(我们解析目标 uri 以获取一些信息,并使用该信息在我们的数据存储中查找信息),那么404 Not Found 通常是一个不错的选择。如果问题追溯到请求的正文(我们希望表单中的某些选项与枚举列表中的条目匹配,但事实并非如此),那么409 Conflict 是合理的。
如果服务器的数据完全发出,那么您可能正在查看500 Internal Server Error。
处理原始客户端请求的服务器发出失败的内部 HTTP 请求。
服务器无法连接到其他 HTTP 服务器纯粹是实现细节,例如无法连接到数据库或文件系统。
除非失败是由于请求中的信息造成的,否则您最终会得到500 Internal Server Error。