问题 单个请求请求太大资源或太多资源时的HTTP状态代码


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

匿名客户端可以从RESTful API的集合中请求一系列项目 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不满足(?)还是422 Unprocessable Entity?你会推荐什么?

一个相关的问题和答案建议409,但情况略有不同: https://stackoverflow.com/a/13463815/638546


10301
2018-03-03 23:59


起源



答案:


403听起来是最合适的选择。它基本上都是“nu-uh。你不会看到它。”,这就是这里的情况。

10.4.4 403禁止

服务器理解请求,但拒绝履行请求。   授权无效,请求不应重复。 [...]

当然,回应机构包括这个是一个好主意 原因 你拒绝了这个请求。

在我看来,所有其他代码都具有特定的含义,使其在这里被取消资格。

400 是不合适的,因为请求是有效的,你理解它就好了;它只是要求你超过你愿意立刻发送的东西。

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

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

在哪里通过“重新提交”标准意味着“重复”。在这种情况下,无论客户端做什么,该请求都将无效。

416 特别是指“Range”标题,所以它完全出来了。

417 同样指的是一个标题字段(在这种情况下是“Expect”),所以它同样是出来的。

422 是不合适的,因为它具体意味着你发了一个 实体 这在语法上是正确的,但仍然被打破。由于GET传统上没有请求体(没有实体),因此没有什么是不可处理的。如果客户端正在发送请求,那么您可能几乎有一个案例......但是,您还必须为RESTful API要求POST不更新任何内容的原因做好准备。

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


13
2018-03-04 00:20



不,422不是特定于WebDAV。但这确实不是正确的地位。 - Julian Reschke
@cHao好一个;)谢谢 - Akseli Palén
@JulianReschke:状态代码422的定义 RFC 4918,它描述了WebDAV ...而我无处可寻。如果服务器在我做非WebDAV相关的东西时发回给我,我会很惊讶,因为我甚至不知道代码存在于RFC 2616. :) - cHao
cHao:您应该查看IANA状态代码注册表,而不是RFC 2616.请参阅 iana.org/assignments/http-status-codes/http-status-codes.xml - Julian Reschke
@JulianReschke:尽管如此,这个链接指向RFC 4918.代码是为WebDAV制作的,我没有看到任何支持它在该上下文之外使用的东西。 - cHao


答案:


403听起来是最合适的选择。它基本上都是“nu-uh。你不会看到它。”,这就是这里的情况。

10.4.4 403禁止

服务器理解请求,但拒绝履行请求。   授权无效,请求不应重复。 [...]

当然,回应机构包括这个是一个好主意 原因 你拒绝了这个请求。

在我看来,所有其他代码都具有特定的含义,使其在这里被取消资格。

400 是不合适的,因为请求是有效的,你理解它就好了;它只是要求你超过你愿意立刻发送的东西。

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

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

在哪里通过“重新提交”标准意味着“重复”。在这种情况下,无论客户端做什么,该请求都将无效。

416 特别是指“Range”标题,所以它完全出来了。

417 同样指的是一个标题字段(在这种情况下是“Expect”),所以它同样是出来的。

422 是不合适的,因为它具体意味着你发了一个 实体 这在语法上是正确的,但仍然被打破。由于GET传统上没有请求体(没有实体),因此没有什么是不可处理的。如果客户端正在发送请求,那么您可能几乎有一个案例......但是,您还必须为RESTful API要求POST不更新任何内容的原因做好准备。

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


13
2018-03-04 00:20



不,422不是特定于WebDAV。但这确实不是正确的地位。 - Julian Reschke
@cHao好一个;)谢谢 - Akseli Palén
@JulianReschke:状态代码422的定义 RFC 4918,它描述了WebDAV ...而我无处可寻。如果服务器在我做非WebDAV相关的东西时发回给我,我会很惊讶,因为我甚至不知道代码存在于RFC 2616. :) - cHao
cHao:您应该查看IANA状态代码注册表,而不是RFC 2616.请参阅 iana.org/assignments/http-status-codes/http-status-codes.xml - Julian Reschke
@JulianReschke:尽管如此,这个链接指向RFC 4918.代码是为WebDAV制作的,我没有看到任何支持它在该上下文之外使用的东西。 - cHao


这应始终产生400系列客户端错误。确切地说,哪个错误是由API / CGI开发人员选择的。我期待405,406,416或'全能'417。api开发人员可以控制这些错误消息的文本(正文)以包含更多有用的信息。


-1
2018-03-04 00:12



不,417不是“全部抓住”。它有一个非常具体的用例。 - Julian Reschke