28

有人知道哪种 HTTP 状态码适合以下情况吗?

匿名客户端可以使用GET /collection/?range_start=100&range_end=200. 示例查询返回一个包含 100 个项目的列表(在 JSON 中)。对于客户可以请求的项目数量也有限制,比如说 300。例如,如果客户端询问 [100, 1100] 范围内的 1000 个项目,响应状态代码应该是什么意思是 700 个项目超出限制?

应该是 400 Bad Request、403 Forbidden、409 Conflict、416 Requested Range Not Satisfiable(?) 还是 422 Unprocessable Entity?你会推荐什么?

一个相关问答提出409但情况略有不同: https ://stackoverflow.com/a/13463815/638546

4

2 回答 2

24

403 听起来是最合适的选择。它基本上说“nu-uh。你看不到那个。”,这几乎就是这种情况。

10.4.4 403 禁止

服务器理解请求,但拒绝执行。 授权将无济于事,并且不应重复请求。[...]

当然,响应正文中包含您拒绝请求的原因是个好主意。

在我看来,所有其他代码都有特定的含义,无法在这里使用它们。

400不太合适,因为请求有效,你理解就好了;它只是要求比你愿意一次发送的更多。

409不合适,因为它与资源的“状态”特别相关。(这适用于您链接的问题,因为在这种情况下,错误是添加到已经“满”的集合中。但是,在您的情况下,不是资源有问题;而是请求。)另外,

仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许使用此代码。

其中“重新提交”标准意味着“重复”。在这种情况下,无论客户端做什么,该请求都是无效的。

416专门指“范围”标头,因此完全不存在。

417同样指的是标题字段(在本例中为“Expect”),因此它同样被排除在外。

422不合适,因为它特别表示您发送了一个语法正确但仍然损坏的实体。由于 GET 传统上没有请求正文(没有实体),因此没有什么是不可处理的。如果客户端正在发布请求,您可能几乎有一个案例......但是,您还必须说明为什么 RESTful API 需要一个不更新任何内容的 POST。

(我大约有 47% 的人确信代码在 WebDAV 之外也没有多大意义……但似乎确实有可以想象的用例。只是不是这个。)

于 2013-03-04T00:20:40.140 回答
-4

这应该总是产生 400 系列客户端错误。究竟哪个错误是由 API/CGI 开发人员选择的。我希望是 405、406、416 或 'catch-all' 417。api 开发人员可以控制这些错误消息的文本(正文)以包含更多有用的信息。

于 2013-03-04T00:12:48.637 回答