如何区分故意的 controller-generated 404 和 REST API 中的实际错误?

How to distinguish a deliberate, controller-generated 404 from an actual error in a REST API?

在 JSON-REST 服务架构中(遵循 these patterns 的方法和响应代码)我们经常需要生成故意的 404 响应 - 例如,如果 GET /users/123 被路由到控制器,然后无法找到 ID 为 123 的用户实体,我们 return 一个 404 响应,在许多情况下将包含一个 JSON 有效载荷,错误为 message/code/etc .

现在,当我们为特定 API 提供客户端时,我们希望客户端在不同条件下表现不同。例如,如果我们将客户端指向错误的主机,我们可能会收到 404 not found from that host - 相反,如果我们确实访问了服务,我们可能会收到无效用户 ID 的 404。

在这种情况下,就客户端而言,“404 用户 ID 未找到”不是错误 - 与任何其他“404 未找到”相反,后者应导致客户端抛出异常.

我的问题是,如何区分这些 404 错误?

仅基于响应?

通过添加 header 来指示有效响应?

或者其他方式?

两种情况都可以return404。由于 4xx 代码是客户端相关代码,即使出现错误,return 内容也是可以的。

现在,可以根据响应的 body 来判断它是哪种 404。请记住,响应应携带与客户端提供的 Accept header 兼容的 mime-type。因此,如果客户端 "knows" 您的特定 error-describing 格式,您的服务器可以回答更详细的描述。

这样,服务器可以决定客户端是否理解带有 404 的详细响应, 客户端也可以理解何时收到常规 404,或带有它可以处理的消息。

这在语义上是正确的,并且与 HTTP 兼容。