REST API-当GET的查询找不到结果时返回什么



我正在调用一个后端REST端点,该端点接受查询参数并搜索匹配结果/people?name=joe,我想知道当在DB中找不到匹配name=joe的对象时,我应该返回什么状态代码和返回数据。

我考虑过的事情:

  • 如果我直接命中了一个端点/people/joe,但没有找到它,那么我肯定会返回404
  • 如果我遇到的端点返回了一个查询的结果列表,比如/people?name=joe应该返回所有名为joe的人,那么我只会返回200,并以一个空列表作为主体。但在我的情况下,每个名字只能有一个对象,所以我不会返回列表,所以这不适用于这里

所以这是一种不同的情况,在这种情况下,我要到达一个端点并将一个查询参数传递给";搜索";对于一些数据。预计在许多情况下,这些数据还不存在。这似乎与上面的第一个要点非常相似,但我不喜欢在这里返回404,因为这不一定是错误。

我是否应该返回一个200,但以一个空对象{}为主体,然后我的前端应该检查body == {}是否意味着找不到数据?

还是我应该在这里还404?同样,在我的情况下,这并不是一个真正的错误,这就是为什么我不想使用404,但如果这是最有意义的,那么我可以。

Easy parts first-状态代码是通过网络域传输文档的元数据(Webber,2011(。在GET请求(请求资源的当前选定表示(的上下文中,200响应指示响应内容是资源的表示(例如,与错误的表示相反(。

此外,URI是不透明的:通用HTTP组件不会根据其标识符的拼写来假设资源的语义。换句话说;规则";两种完全相同

/people/joe
/people?joe
/people?name=joe
...

因此,在HTTP级别,问题的答案很简单:如果存在当前表示,那么您将以200状态回复GET请求,并将当前表示复制到响应内容中。


困难的部分是决定何时存在当前表示,以及它看起来是什么样子。REST和HTTP对此并没有什么可说的。这是一个资源设计问题。

例如,这就是交互作用;遵循所有规则":

GET /people?name=dave HTTP/1.1
HTTP/1.1 200 OK
Content-Location: /people?name=dave
Content-Type: text/plain
Dave's not here, man

HTTP是一种通过网络请求文档/传输文档的通用机制,但它不知道文档是什么样子的,也不知道我们使用什么密钥来识别存储中的文档。


如果你处理的是描述零个或恰好一个事物的表示,那么使用一个空的或恰好包含一个元素的列表仍然是合理的(如果你熟悉Option/Optional/Maybe:同样的想法,我们呈现的是具有可迭代集合语义的东西(

HTTP/1.1 200 OK
Content-Location: /people?name=dave
Content-Type: application/json
[]
HTTP/1.1 200 OK
Content-Location: /people?name=bob
Content-Type: application/json
[{ 
... 
}]

我同意在您的场景中,200和空集合比404更好。我不喜欢寻找{}的想法,它不够明确。

可能的方法:

200 ok
{
items:[]
}
200 ok
{
size:0//, 
//items:undefined
}
200 ok
[]
206 Partial Content
Accept-Ranges: items
Content-Range: items 0-0/0
// []

最新更新