我正在调用一个后端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
// []