正确的REST响应是否有空表?


106

比方说,你想通过调用来获得用户的列表GETapi/users,但目前该表已被截断,所以没有用户。什么是这种情况下适当的反应:404204


19
我会用200和一个空集合作为响应(不是一个空的响应主体,而是一个内部没有任何元素的集合,根据返回的格式,它看起来会有所不同)
toniedzwiedz 2012年

4
在这种情况下,404可能更适合“找不到表”。我会说返回一个空列表。
马塔2012年


2
@EJoshuaS不是。这两个问题都是我的,而且很老。它们是相似的,但不是重复的。
IMB

1
@EJoshuaS他们显然不是重复的。这个问题是关于/api/users当一个约/api/users/1
富兰克林于

Answers:


231

我不会说。

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

404状态代码应保留给找不到资源的情况。在这种情况下,您的资源是users的集合。该集合存在,但当前为空。就个人而言,如果我有200一天和404第二天只是因为有人碰巧删除了几个用户,作为您的应用程序的客户端作者,我会很困惑。我应该做些什么?我的网址错误吗?是否有人更改了API并忽略了重定向。

为什么不选择204(无内容)?

这是w3c对204状态码的描述的摘录

服务器已完成请求,但不需要返回实体,可能要返回更新的元信息。

尽管在这种情况下这似乎是合理的,但我认为这也会使客户感到困惑。204假定A 表示某些操作已成功执行,并且不需要返回任何数据。这非常适合作为对DELETE请求的响应,或者可以触发一些不需要返回数据的脚本。对于api/users,您通常希望收到用户集合的表示。一次发送响应正文,而另一次不发送响应正文,可能会引起误解。

为什么我要使用200(确定)

由于上述原因(一致性),我将返回一个空集合的表示形式。假设您正在使用XML。用于非空用户集合的普通响应正文可能如下所示:

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

如果列表为空,则您可以使用以下内容进行响应(同时仍使用200):

<users/>

无论哪种方式,客户端都会收到遵循某种众所周知的格式的响应正文。没有不必要的混乱和状态代码检查。同样,没有违反状态码定义。大家都开心

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


4
绝对同意。对于REST,我只需发送一个空数组200的状态码即可[]
乍得·约翰逊

说得通。无需加倍努力。404会令人困惑。
Witold Kaczurba,

让我们假设API描述了您的口袋里的硬币,并带有端点:GET /singleCoin- 从口袋里返回随机的单个硬币,GET /severalCoins- 从口袋里返回一些您可以一次抓取的硬币。可以说您现在口袋里没有硬币。当你问的时候GET /singleCoin你会得到404 Not Found,但是当你问的时候GET /severalCoins你会得到200 OK空名单[]。一个事实-您没有硬币,用不同的答案描述,为什么?我想说最好总是404 Not Found拿出来,因为口袋里没有硬币。
sempasha

1
@sempasha取决于您的意思GET /severalCoins。如果您要求GET /severalCoins 必须返回一些硬币,那么它就不应为200,因为它不合适。服务器无法提供客户端所需的内容。对于/singleCoin这一点,因为客户想要的是一个硬币,没有更多的,没少是显而易见的。这与相同/coins/7。与/coins端点相反,通常客户期望没有硬币,一个硬币或多个硬币。他们都是有效的回应。如果没有硬币,那就是他们想要的。就像List<Coin>Java中的emply一样,而不是null
富兰克林于

15

我会根据运行时情况回答以下两个代码之一:

404(未找到)

如果您没有桌子,这个答案是非常正确的。不仅是空表,而且没有用户表。它证实了确切的想法-没有资源。进一步的选项是为了提供更多详细信息,为什么您的表不存在,有几个更详细的代码,但是404非常适合用来指代您实际上没有表的情况。

200(确定)

在所有具有表但表为空或请求处理器过滤掉所有结果的情况下。这意味着“您的请求是正确的,一切都很好,但是您不匹配任何数据,仅仅是因为我们没有数据或没有与您的请求匹配的数据。这应该与安全拒绝答案不同。在有一些数据的情况下,我也投票决定返回200,通常情况下,您可以访问表,但不能访问与您的请求匹配的所有数据(由于对象级安全性,数据已被过滤掉,但通常,您可以请求)。


10

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


2

肯定会返回200。

404表示找不到资源。但是资源存在。并且,如果响应具有404状态。您如何知道用户列表为空还是已满?


  • '/ users'如果为空,应返回'200'。
  • '/ users / 1'(如果找不到ID)。应该返回404。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.