REST API 响应状态代码 - 搜索 GET returns 单个结果

REST API response status code - search GET that returns a single result

如果我们有一个搜索 GET REST API 端点,return 为当前登录的客户提供一个或零个结果,我想知道正确的响应状态代码是什么,因为实例:

api/subscriptions?productId=1

根据规格,客户可以订阅一次,也可以不订阅该产品。

据我所知,根据惯例,这应该是一个 200 结果,无论结果是否存在(与 [=28= 的搜索端点的逻辑相同) ]s 对象列表)。我认为这里 return 404 是不正确的,因为这个结果只是一个可能存在的资源?

我知道这种查询甚至可能看起来非常规,因为它的目的不仅是获得订阅,而且还要检查它是否存在。

我想到了将响应模型包装在对象结果中,状态代码为 200:

public class ActiveSubscriptionModel
{
    public bool HasActiveSubscription { get; set; }
    public SubscriptionModel Subscription { get; set; }
}

TL;DR: 200 是要使用的正确状态代码


As far as I understand, and according to the convention, this should be a 200 result, no matter if the result exists or not (the same logic as for a search endpoint that returns a list of objects).

不是根据 约定,而是根据 specification -- 200 is the status code that means that the payload of the HTTP response is a representation of the requested resource.

“您要求我提供由 /api/subscriptions?productId=1 标识的网页的表示形式,这就是我要发回给您的内容。” -- 200.

请注意,状态代码(transfer of documents over a network 域的元数据)与 您的 域中文档的语义完全无关。


204 No Content might be appropriate. Status codes can be somewhat subjective.

不是很好的选择。 204 宣布响应的有效载荷为零字节长,并暗示用户代理不应离开当前视图。

比较我们“应该”对 Web 浏览器的期望:主体长度为零的 200 响应将遍历到“空”网页的视图; 204 响应将使我们看到之前的视图(可能会使查看网页的人感到困惑)。

204 的亮点是我们在 HTTP 兼容 编辑器 中对资源进行本地更改并与服务器共享的场景。我们点击编辑器上的保存按钮,表示被 PUT 到服务器,服务器按原样接受它,我们可以继续编辑而不刷新页面。

(您会看到 205 Reset 是相似的——适用于我们使用 Web 表单进行数据输入时)。


选择适当状态代码的部分技巧是记住服务器不控制客户端 - 我们不一定向我们控制的 java 脚本代码发送响应。因此,我们希望确保我们发送的消息每个人都能以相同的方式理解。