129

假设您想通过调用来获取用户列表GETto api/users,但目前该表已被截断,因此没有用户。这种情况的正确响应是什么:404204

4

5 回答 5

266

我会说,也不是。

为什么不是 404(未找到)?

404 状态码应保留用于未找到资源的情况。在这种情况下,您的资源是users 的集合。此集合存在,但当前为空。就个人而言,如果我只是因为有人碰巧删除了几个用户而获得了200一天和第二天的结果,那么作为您的应用程序客户端的作者,我会感到非常困惑。404我应该做些什么?我的网址错了吗?是否有人更改了 API 并忽略了重定向。

为什么不是 204(无内容)?

这是 w3c 对 204 状态码的描述的摘录

服务器已完成请求,但不需要返回实体主体,并且可能希望返回更新的元信息。

虽然在这种情况下这似乎是合理的,但我认为这也会让客户感到困惑。A204应该表示某些操作已成功执行,不需要返回任何数据。这非常适合作为对DELETE请求的响应或触发一些不需要返回数据的脚本。在 的情况下api/users,您通常希望收到您的用户集合的表示。一次发送响应正文而另一次不发送它是不一致的并且可能具有误导性。

为什么我会使用 200 (OK)

出于上述原因(一致性),我将返回一个空集合的表示。假设您正在使用 XML。非空用户集合的正常响应正文可能如下所示:

<users>
  <user>
    <id>1</id>
    <name>Tom</name>
  </user>
  <user>
    <id>2</id>
    <name>IMB</name>
  </user>
</users>

如果列表是空的,你可以用这样的东西来回应(同时仍然使用 a 200):

<users/>

无论哪种方式,客户端都会收到遵循某种众所周知的格式的响应正文。没有不必要的混淆和状态码检查。此外,没有违反状态代码定义。每个人都很高兴。

您可以对 JSON 或 HTML 或您使用的任何格式执行相同的操作。

于 2012-11-13T19:14:54.370 回答
16

我会根据运行时情况回答两个代码之一:

404(未找到)

如果您没有桌子,这个答案是非常正确的。不仅是空表,而且没有用户表。它证实了确切的想法 - 没有资源。进一步的选项是提供更多细节为什么你的桌子不存在,有几个更详细的代码,但 404 非常适合参考你真的没有桌子的情况。

200(确定)

您有表格但它是空的或您的请求处理器过滤掉所有结果的所有情况。这意味着“您的请求是正确的,一切正常,但您不匹配任何数据,只是因为我们没有数据或我们没有与您的请求匹配的数据。这应该与安全拒绝答案不同。我也投票返回 200 在您有一些数据并且通常您被允许访问表但无权访问与您的请求匹配的所有数据的情况下(由于对象级别的安全性,数据被过滤掉但通常您被允许要求)。

于 2015-02-13T22:16:22.963 回答
11

如果您期望用户对象的列表,最好的解决方案是返回一个空列表 ([]) 并返回 200 OK,而不是使用 404 或 204 响应。

于 2017-05-08T23:30:01.853 回答
7

肯定返回200。

404 表示找不到资源。但是资源是存在的。而且,如果响应具有 404 状态。你怎么知道用户列表是空的还是满的?


  • '/users' 如果为空,则应返回 '200'。
  • '/users/1' 如果没有找到 id。应该返回 404。
于 2019-11-12T12:10:28.163 回答
4

空列表必须200 OK

原因:空表表示该表存在但没有任何记录。

404 Not Found表示请求的端点不存在。

于 2019-04-23T13:23:00.633 回答