假设您希望通过调用get
到api/users
来获取用户列表,但目前该表已被截断,因此没有用户。对于此方案404
或204
?
答案 0 :(得分:201)
我不会说。
404状态代码应保留用于未找到资源的情况。在这种情况下,您的资源是用户集合。此集合存在,但它目前是空的。就个人而言,如果我有一天200
和第二天404
因为有人碰巧删除了几个用户,我会非常感到困惑。我应该做些什么?我的网址错了吗?是否有人更改了API并忽略了重定向。
以下是the description of the 204 status code by w3c
的摘录服务器已完成请求但不需要返回实体主体,并且可能希望返回更新的元信息。
虽然在这种情况下这似乎是合理的,但我认为它也会使客户感到困惑。 204
应该表示某些操作已成功执行,并且不需要返回任何数据。这对于DELETE
请求的响应或者可能触发一些不需要返回数据的脚本是完美的。如果是api/users
,您通常希望收到您的用户集合的代表。一次发送响应主体而不是另一次发送响应主体是不一致的并且可能具有误导性。
由于上面提到的原因(一致性),我将返回一个空集合的表示。我们假设您正在使用XML。非空用户集合的正常响应主体可能如下所示:
<users>
<user>
<id>1</id>
<name>Tom</name>
</user>
<user>
<id>2</id>
<name>IMB</name>
</user>
</users>
如果列表为空,您只需回复此类内容(同时仍使用200
):
<users/>
无论哪种方式,客户端都会收到一个遵循某种众所周知的格式的响应主体。没有不必要的混淆和状态代码检查。此外,没有违反状态代码定义。每个人都很开心。
您可以使用JSON或HTML或您正在使用的任何格式执行相同操作。
答案 1 :(得分:12)
我根据运行时情况回答两个代码中的一个:
404(未找到)
如果您没有桌子,这个答案是非常正确的。不只是空表而且没有USER TABLE。它证实了确切的想法 - 没有资源。更多的选项是提供更多详细信息为什么你的桌子不存在,有几个更详细的代码,但404非常适合参考你真的没有桌子的情况。
200(确定)
您有桌子但是空的所有情况或您的请求处理器过滤掉所有结果。这意味着您的请求是正确的,一切正常但您不匹配任何数据只是因为我们没有数据或我们没有与您的请求匹配的数据。这应该与安全拒绝答案不同。我也投票在有一些数据的情况下返回200,一般情况下你可以访问表但无法访问与你的请求匹配的所有数据(由于对象级别的安全性,数据被过滤掉了,但一般来说你被允许请求)。
答案 2 :(得分:8)
如果您期望用户对象列表,最好的解决方案是返回一个空列表([])200 OK,而不是使用404或204响应。
答案 3 :(得分:1)
404表示找不到资源。但是资源存在。并且,如果响应具有404状态。您怎么知道用户列表为空还是已填充?
答案 4 :(得分:0)
它应该 200 OK ,且列表为空。
原因:空表意味着该表存在但没有记录。
404未找到表示所请求的端点不存在。