空表的正确 REST 响应?

假设您希望通过调用 GETapi/users来获取用户列表,但是当前表被截断,因此没有用户。对于这个场景,什么是正确的响应: 404还是 204

56329 次浏览

要我说,都不是。

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

404状态代码应该为找不到资源的情况保留。在这种情况下,您的资源是 用户的集合。此集合存在,但当前为空。就我个人而言,如果仅仅因为某人删除了几个用户,我就得到了一个 200和一个 404,那么作为你的应用程序的客户端的作者,我会感到非常困惑。我该怎么办?我的网址错了吗?是不是有人修改了 API 而忽略了重定向。

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

以下是 W3c 对204状态码的描述的节选

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

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

我为什么要用200(OK)

出于上面提到的原因(一致性) ,我将返回一个空集合的表示形式。让我们假设您使用的是 XML。对于非空的用户集合,正常的响应主体可能如下所示:

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

如果列表是空的,你可以用类似这样的方式来响应(同时仍然使用 200) :

<users/>

无论采用哪种方式,客户机都会接收遵循某种众所周知的格式的响应主体。没有不必要的混淆和状态代码检查。此外,没有违反状态代码定义。皆大欢喜。

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

根据运行时的情况,我会回答以下两种代码中的一种:

404(未找到)

如果您没有表,那么这个答案是非常正确的。不仅仅是空表,而且没有用户表。它证实了确切的想法,没有资源。进一步的选择是提供更多的细节为什么你的表缺席,有两个更详细的代码,但404是相当好的情况下,你真的没有表。

200(OK)

在所有情况下,您拥有表,但它是空的,或者您的请求处理器过滤掉了所有结果。这意味着‘您的请求是正确的,一切正常,但是您没有匹配任何数据,只是因为我们没有数据或者我们没有与您的请求匹配的数据。’。这应该不同于安全拒绝回答。我也投票返回200,在这种情况下,你有一些数据,一般来说,你可以访问表,但没有访问所有数据匹配你的请求(数据被过滤了,因为对象级别的安全,但一般来说,你可以请求)。

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

它必须带有空列表的 200好的

为什么: 空表意味着表存在但没有任何记录。

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

肯定能回到200。

404表示未找到资源。但资源是存在的。还有,如果响应是404状态。如何知道用户列表是空的还是已填充的?


  • 如果’/users’为空,则应返回’200’。
  • 如果未找到 id,则返回“/users/1”。