3

我们正在创作 REST 服务,当有人请求具有不存在的父 ID 的资源时该怎么做存在争论。

示例:您正在请求与公司关联的人员列表,因此您GET的 ID 为 1,但该公司 ID 不存在。

我认为 REST 的定义表明我们将简单地返回一个空列表(导致 a HTTP 204 (No Content)),因为根据规范,HTTP Bad Request 仅适用于格式错误的语法:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

由于语法错误,服务器无法理解该请求。客户端不应该在没有修改的情况下重复请求。

我认为更清楚的是没有要解释的错误,您请求的资源不存在。

关于最佳实践的想法?

这里有一个 SO 讨论:HTTP 400 (bad request) for logical error, not malformed request syntax虽然它有点抽象,如果我应该发布这个,或者只是使用那个问题,我会很伤心。

4

3 回答 3

6

如果你这样做

GET /company/1

并且不存在 id 为 1 的公司,那么我认为适当的 HTTP 状态代码是 404 - 未找到。

但是,如果你要这样做,

GET /companies?id=1

然后我会返回一个 200 和一个空的公司列表。

于 2011-09-03T00:36:30.030 回答
3

204 不是错误代码,它是成功代码,但这是一个小问题。我不经常在空列表中看到它,而是在没有有意义的内容可响应的成功响应中看到它,例如成功的 DELETE。例如,如果您要返回 JSON,则内容为 200[]是我对空结果列表的期望。但是,我认为在您的情况下使用它是不正确的。

对于您描述的情况,404 Not Found 是一个更常见的错误。你是对的,这不是语法错误,所以 400 是不合适的,但实际上,资源不存在。404 Not Found 是一个准确的响应。

但在 200、204 和 404 之间进行选择时,正确答案是:视情况而定。问题是它是否是一个错误。404 更具表现力(客户可以知道没有这样的公司),但您可以用表现力换取安全性,这意味着客户无法判断具有该 ID 的公司是否存在可能是件好事。

于 2011-09-04T04:37:22.603 回答
0

缓存呢?只有 200 会被缓存,204 和 404 都不会被缓存。如果这很重要 200 与空列表似乎没问题。不确定空的单个元素呢?

于 2012-07-19T21:06:24.913 回答