当前位置: 首页 > 知识库问答 >
问题:

空表的正确Rest响应?

羿博延
2023-03-14

假设您希望通过调用getapi/users来获取用户列表,但当前该表被截断,因此没有用户。对于这种情况,正确的反应是什么:404204

共有3个答案

白光耀
2023-03-14

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

白青青
2023-03-14

根据运行时的情况,我会回答两个代码中的一个:

404(未找到)

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

200(OK)

所有情况下,您有一个表,但它是空的,或者您的请求处理器过滤掉了所有结果。这意味着“您的请求是正确的,一切正常,但您不匹配任何数据,因为我们没有数据或我们没有与您的请求匹配的数据。”。这应该不同于安全拒绝回答。如果您有一些数据,并且通常允许您访问表,但无法访问与您的请求匹配的所有数据(由于对象级别的安全性,数据被过滤掉了,但通常允许您请求),我也会投票返回200。

夏理
2023-03-14

我想也是。

404状态代码应保留用于未找到资源的情况。在本例中,您的资源是用户的集合。此集合存在,但当前为空。就我个人而言,如果我一天收到一个200,第二天收到一个404,仅仅因为有人删除了几个用户,我作为你的应用程序客户端的作者会非常困惑。我该怎么办?我的网址错了吗?是否有人更改了API而忽略了保留重定向。

以下是w3c对204状态代码描述的摘录

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

虽然在这种情况下这似乎是合理的,但我认为这也会让客户感到困惑。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或您正在使用的任何格式执行相同的操作。

 类似资料:
  • 我正在测试一个由JAX-WS编写的Rest服务。我执行我的服务,服务返回一个实体,我将该实体设置为响应状态ok,最后服务返回状态ok,代码200,但响应体为空。我调试了我的代码,下面这一行没有问题。原因是什么? 我的实体类是简单的Pojo:

  • 我想在Spring中创建一个符合REST的endpoint。endpoint应该允许分页。 请求非常简单,是否访问url/资源?页码=1 我发现了两种返回数据的大方法: 返回包含以下内容的自定义对象: 此方法的问题是它不再返回资源,而是返回资源的包装器。 这解决了资源问题,但它使endpoint更难使用,这是违反直觉的,因为它也需要额外的工作来实现。 我想知道,什么标准被更广泛地使用,为什么?对此

  • 什么是REST API响应结构和布局的最佳实践? Scrath示例: 成功回应: 失败响应:

  • 我有一个用Java编写的Spring Boot应用程序,它是一个REST API。该服务(Svc A)调用REST API服务(Svc B),该服务也是用Java编写的Spring Boot应用程序。当没有找到数据时,Svc B返回404状态码。我需要将此响应更改为200状态代码,并返回一个空响应对象。我不确定是否或如何做到这一点。 我可以捕捉错误,并确定404是否是这个没有数据发现的错误。但是,

  • 我编写了一个方法,该方法应该在utf-8中以字符串类型返回有效的正文,但在发出请求后,我在UTF-16中得到响应。postman中的内容类型头是application/json。我在stackoverflow中搜索任何可能的解决方法,但任何解决方案都无济于事,包括这个主题(.我如何更改它以获得有效的主体?Thanx!

  • 例如,运行的GET请求,但没有id#9的用户。哪个是最好的响应代码? 200确定 202已接受 204无内容 400错误请求 找不到404