假设您希望通过调用 GET到 api/users来获取用户列表,但是当前表被截断,因此没有用户。对于这个场景,什么是正确的响应: 404还是 204?
GET
api/users
404
204
要我说,都不是。
404状态代码应该为找不到资源的情况保留。在这种情况下,您的资源是 用户的集合。此集合存在,但当前为空。就我个人而言,如果仅仅因为某人删除了几个用户,我就得到了一个 200和一个 404,那么作为你的应用程序的客户端的作者,我会感到非常困惑。我该怎么办?我的网址错了吗?是不是有人修改了 API 而忽略了重定向。
200
以下是 W3c 对204状态码的描述的节选
服务器已经完成了请求,但是不需要返回实体主体,并且可能希望返回更新的元信息。
虽然在这种情况下这似乎是合理的,但我认为这也会使客户感到困惑。204应该表示某些操作已成功执行,不需要返回任何数据。这非常适合作为对 DELETE请求的响应,或者触发一些不需要返回数据的脚本。对于 api/users,您通常期望收到用户集合的表示。一次发送响应机构而另一次不发送响应机构是不一致的,可能会产生误导。
DELETE
出于上面提到的原因(一致性) ,我将返回一个空集合的表示形式。让我们假设您使用的是 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 表示请求的端点不存在。
404表示未找到资源。但资源是存在的。还有,如果响应是404状态。如何知道用户列表是空的还是已填充的?