假设您希望通过调用get
到api/users
来获取用户列表,但当前该表被截断,因此没有用户。对于这种情况,正确的反应是什么:404
或204
?
如果您期望用户对象列表,最好的解决方案是返回一个空列表([]),比使用404或204响应返回200 OK。
根据运行时的情况,我会回答两个代码中的一个:
404(未找到)
如果没有表格,这个答案是非常正确的。不仅是空表,而且没有用户表。它证实了确切的想法——没有资源。进一步的选项是提供更多的详细信息来说明为什么您的表不存在,有两个更详细的代码,但404非常适合用于说明您确实没有表的情况。
200(OK)
所有情况下,您有一个表,但它是空的,或者您的请求处理器过滤掉了所有结果。这意味着“您的请求是正确的,一切正常,但您不匹配任何数据,因为我们没有数据或我们没有与您的请求匹配的数据。”。这应该不同于安全拒绝回答。如果您有一些数据,并且通常允许您访问表,但无法访问与您的请求匹配的所有数据(由于对象级别的安全性,数据被过滤掉了,但通常允许您请求),我也会投票返回200。
我想也是。
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