Rest 空表的正确休息响应?
假设您希望通过调用Rest 空表的正确休息响应?,rest,http,restapi,Rest,Http,Restapi,假设您希望通过调用get到api/users来获取用户列表,但当前该表被截断,因此没有用户。对于这种情况,正确的反应是什么:404或204?我也不这么认为 为什么不是404(找不到)? 404状态代码应保留用于未找到资源的情况。在本例中,您的资源是用户的集合。此集合存在,但当前为空。就我个人而言,如果我一天收到一个200,第二天收到一个404,仅仅因为有人删除了几个用户,我作为你的应用程序客户端的作者会非常困惑。我该怎么办?我的网址错了吗?是否有人更改了API而忽略了保留重定向 为什么不是204
get
到api/users
来获取用户列表,但当前该表被截断,因此没有用户。对于这种情况,正确的反应是什么:404
或204
?我也不这么认为
为什么不是404(找不到)?
404状态代码应保留用于未找到资源的情况。在本例中,您的资源是用户的集合。此集合存在,但当前为空。就我个人而言,如果我一天收到一个200
,第二天收到一个404
,仅仅因为有人删除了几个用户,我作为你的应用程序客户端的作者会非常困惑。我该怎么办?我的网址错了吗?是否有人更改了API而忽略了保留重定向
为什么不是204(没有内容)?
这是一篇文章的摘录
服务器已完成请求,但不需要返回实体主体,并且可能希望返回更新的元信息
虽然在这种情况下这似乎是合理的,但我认为这也会让客户感到困惑。204
表示某个操作已成功执行,无需返回任何数据。这是对DELETE
请求的完美响应,或者可能触发一些不需要返回数据的脚本。对于api/users
,您通常希望收到用户集合的表示。一次发送响应正文,另一次不发送,这是不一致的,并且可能会产生误导
为什么我会用200(好的)
出于上述原因(一致性),我将返回一个空集合的表示。假设您使用的是XML。非空用户集合的正常响应主体可能如下所示:
<users>
<user>
<id>1</id>
<name>Tom</name>
</user>
<user>
<id>2</id>
<name>IMB</name>
</user>
</users>
无论哪种方式,客户机都会收到一个响应体,它遵循某种众所周知的格式。没有不必要的混乱和状态代码检查。此外,没有违反任何状态代码定义。大家都很高兴
您可以对JSON或HTML或您正在使用的任何格式执行相同的操作。我将根据运行时的情况回答以下两个代码之一: 404(未找到) 如果没有表格,这个答案是非常正确的。不仅是空表,而且没有用户表。它证实了确切的想法——没有资源。进一步的选项是提供更多的详细信息来说明为什么您的表不存在,有两个更详细的代码,但404非常适合用于说明您确实没有表的情况 200(正常)
所有情况下,您有一个表,但它是空的,或者您的请求处理器过滤掉了所有结果。这意味着“您的请求是正确的,一切正常,但您不匹配任何数据,因为我们没有数据或我们没有与您的请求匹配的数据。”。这应该不同于安全拒绝回答。如果您有一些数据,并且通常允许您访问表,但无法访问与您的请求相匹配的所有数据(由于对象级别的安全性,数据被过滤掉了,但通常允许您请求),我也投票返回200。如果您需要用户对象列表,最好的解决方案是返回一个200 OK的空列表([]),而不是使用404或204响应。它必须200 OK带空列表 原因:空表表示该表存在,但没有任何记录 404未找到表示请求的端点不存在。肯定返回200。 404表示未找到资源。但资源是存在的。而且,如果响应具有404状态。你怎么知道用户列表是空的还是满的
- “/users”如果为空,则应返回“200”
- 如果找不到id,则返回“/users/1”。应该返回404
/api/users
,而那个问题是关于/api/users/1
。我完全同意。对于其余部分,我只需返回一个带有空数组的状态代码200:[]
。这很有意义。没有必要让它更难。404可能会让人困惑。让我们假设API描述您口袋中的硬币,其端点为:GET/singleCoin
-从您的口袋中随机返回一枚硬币,GET/severalCoins
-从您的口袋中返回一些可以一次性抓取的硬币。假设你现在口袋里没有硬币。当您要求GET/singleCoin
时,您将得到404未找到
,但当您要求GET/severalCoins
时,您将得到200 OK
的空列表[]
。一个事实-你没有硬币,用不同的回答描述,为什么?我认为最好总是把404找不到
,因为在你的口袋里找不到硬币。@sempasha这取决于你所说的get/severalCoins
。如果您要求GET/severalCoins
必须返回一些硬币,那么它不应该是200,因为它不合适;服务器无法提供客户端所需的内容。对于/singleCoin
来说,这是显而易见的,因为客户只想要一枚硬币,不多也不少。这与/coins/7
相同。与/coins
端点不同,客户通常不希望有硬币、一枚硬币或多枚硬币。所有这些都是有效的回答。如果没有硬币,这就是他们想要的。它类似于Java中的emply列表
,而不是null
。此外,404用于客户端错误。从文档>“4xx类的
<users/>