具有不存在的查询参数值的GET请求的HTTP状态代码

时间:2018-03-16 23:04:19

标签: rest http api-design http-status-codes

当没有项目与请求匹配时,让我们通过一个简单的示例澄清三种常见情况:

  1. GET /posts/{postId}postId不存在(状态代码404,毫无疑问)
  2. GET /posts?userId={userId}userId的用户没有任何帖子
  3. GET /posts?userId={userId}userId的用户不存在

    我知道案例2和案例3的相应状态代码没有严格的REST准则,但似乎通常的做法是在案例2中返回200,因为它被认为是a"搜索"在posts资源上提出请求,因此据说404可能不是最佳选择。

    现在我想知道是否存在处理案例3的常见做法。基于与案例2类似的推理,200似乎更具相关性(当然在回复正文中,更多信息可能是尽管返回404以强调userId本身不存在的事实也很诱人。

    有什么想法吗?

2 个答案:

答案 0 :(得分:0)

好的,首先,REST并没有说明端点应返回的内容。这是HTTP规范。 HTTP规范指出,如果您请求不存在的资源,则正确的响应代码为404

案例1是对单件事物的请求。正如你所说,这会返回404

在案例2中返回的资源通常是包含元数据和事物集合的信封。信封是否包含任何内容并不重要。所以200是正确的响应代码,因为信封存在,信封就不会有任何东西。如果没有任何内容并且返回404,那么根据规范可以允许说没有信封,但这通常没有完成,因为API无法发送元数据

然后,案例3与案例2完全相同。如果预期响应是一个信封,则无论userId是否有效,信封都存在。如果API设计者认为信息对客户有用,那么在信封中包含元数据指出没有userId的用户是不合理的。

案例2和案例3实际上是相同的情况,并且应该使用空信封或200返回404

答案 1 :(得分:0)

首先,您需要认识到/posts?userId={userId}标识了resource,正好与/posts/{userId}/index.html指定资源的意义相同。

因此GET /posts?userId={userId}“请求传输目标资源的当前所选表示。”

200和404之间的区别是直截了当的;如果您向消费者报告“原始服务器没有找到目标资源的当前表示或者不愿意透露存在该表示”,那么您应该返回404。如果响应有效负载包含资源的当前表示,则应使用200状态代码。

当然,404是来自Client Error response class

的回复
  

服务器应该发送一个包含错误情况解释的表示,以及它是暂时的还是永久的。

所以 计算出要使用哪些状态代码的方法是只查看响应的消息体。如果它是资源的当前表示,则使用200状态代码。如果它是消息的表示,解释当前没有可用的表示,则使用404状态代码。

当然,这就是一个大问题:在每种情况下,资源的表现应该是什么?一旦你知道了,你可以解决剩下的问题。

如果您认为意外的标识符指示客户端上的错误(例如,损坏的链接),那么它可能会改善消费者的体验,将其报告为显式错误,而不是返回空的表示列表。

但这是一个判断电话;不同的API会有不同的答案,而HTTP并不是特别偏向某种方式; HTTP只是要求您确保响应代码和标头适合您所做的选择。