未找到资源的正确 HTTP 状态代码

b00*_*il' 4 api rest http http-status-codes http-status-code-404

例如,我需要找到地址为api/user/1 的User 资源。在本例中,我正在寻找 ID 为 1 的确切资源,如果资源不存在,则应返回 404。

但是,如果我想找到确切的最新用户资源但它不存在怎么办?例如,使用地址api/latest-user。现在应该返回 404 还是返回空结果的 200?

让我困惑的是,在这两种情况下,我都在寻找某个资源,如果在第一种情况下是通过 ID 完成的,那么在第二种情况下是按顺序完成的。

如何让客户更容易理解并且不被误解?什么对客户来说更容易理解?

Voi*_*son 7

但是,如果我想找到确切的最新用户资源但它不存在怎么办?例如,使用地址 api/latest-user。现在应该返回 404 还是返回空结果的 200?

所以首先要注意的是每条消息的含义

  • 404 资源没有当前表示,响应正文解释了为什么会出现这种情况
  • 200 资源有当前表示,响应正文就是该表示

状态代码很简单:您选择正确描述消息的状态代码。具有挑战性的部分是确定您的“资源”在请求时是否有代表。

即使数据层中没有相应的实体,资源也有表示形式,这是完全正常的。我们可能有一个“空”文档,或者没有项目的列表,或者完全由默认值组成的表示。这些都很好

搜索结果是一个显而易见的答案:您向 google 或 stack Overflow 询问文档列表的表示形式,而此时文档列表为空。所以我们得到了一个空文档列表的表示,状态代码是...200。

粗略地说:200 表示“这是您问题的当前答案”,其中 4xx 表示“我现在无法回答您的问题”,404 表示更具体的“我现在无法回答您的问题,因为我有不知道你在说什么”。


例子:

https://www.youtube.com/watch?v=00000
Run Code Online (Sandbox Code Playgroud)

如果我们尝试获取该资源,我们会从服务器得到什么响应?返回的内容(今天:2023-05-26)是一个 200 响应,其中包含一份文档,上面写着“该视频不再可用”。为什么?因为这是资源的当前表示,并且 200 状态代码告诉 HTTP 响应正文中的表示是资源的表示。

注意:您的网络浏览器根本不会对此感到困惑。


更大的想法:状态代码是网络文档传输域的元数据。200 告诉我们已经成功检索到该文档。现在,我们阅读文档以了解域级别发生的情况,根据我们在成功检索的文档中找到的信息选择适当的逻辑分支。

或者用另一种方式表达:我们(通常)不应该为我们的定制应用程序重新利用 HTTP 元数据。