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

我会用200和一个空集合(不是一个空的响应正文,而是一个没有元素的集合,根据返回的格式,它看起来会有所不同)404在这个上下文中可能更适合“找不到表”。我要说的是返回一个空列表。可能是@EJoshuaS的副本,但不是。这两个问题都是我的,而且都很老了。它们是相似的,但不是重复的。@EJoshuaS它们显然不是重复的。这个问题是关于
/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/>