建议的“达到请求限制”的HTTP REST状态代码


43

我正在整理一个REST服务的规范,其中的一部分将包含在整个服务范围内以及一组资源或单个资源上限制用户的功能。同样,这些超时可以按资源/组/服务进行配置。

我只是在浏览HTTP 1.1规范,并试图决定如何与客户端通信,因为请求已达到极限,因此无法满足请求。

最初,我认为客户端代码403 - Forbidden就是这样,但从规范中可以看出:

授权将无济于事,不应重复请求

困扰着我

实际上似乎503 - Service Unavailable是一种更好的用法-因为它允许通过使用Retry-After标头来传递重试时间。

将来我可能会希望通过电子商务支持“购买”更多的请求(在这种情况下,如果客户端代码402 - Payment Required已完成,那就太好了!)-但我认为这也同样可以被压缩为503响应。

您认为我应该使用哪个?还是有我没有考虑过的另一个?

Answers:


77

429请求太多

用户在给定的时间内发送了太多请求。旨在与速率限制方案一起使用。RFC 6585 附加HTTP状态代码中已接受此代码。

http://i.stack.imgur.com/Y84Lj.jpg

   The 429 status code indicates that the user has sent too many
   requests in a given amount of time ("rate limiting").

   The response representations SHOULD include details explaining the
   condition, and MAY include a Retry-After header indicating how long
   to wait before making a new request...

   Note that this specification does not define how the origin server
   identifies the user, nor how it counts requests.  For example, an
   origin server that is limiting request rates can do so based upon
   counts of requests on a per-resource basis, across the entire server,
   or even among a set of servers.  Likewise, it might identify the user
   by its authentication credentials, or a stateful cookie.

   Responses with the 429 status code MUST NOT be stored by a cache...

听起来很棒-我会记住这一点!它带有免费的猫咪吗?还是它们是协议的扩展?
安德拉斯·佐坦

3
HTTP状态猫-满足您的所有状态需求:flickr.com/photos/girliemac/sets/72157628409467125
Sean McMillan

1
天才!办公室里传来的笑声和掌声-天才!
安德拉斯·佐坦

我最终使用了429-它在规格草案中,但我严重怀疑它最终会被用于其他任何用途。
安德拉斯·佐坦

7

在某种程度上,您可以随意使用这些代码,但我同意您可以使用503,或者如果愿意402,可以使用,而没有人可以抱怨您正在破坏事物。

编辑:纯粹主义者可能会说您应该从503开始,然后在有可能付款时切换。


评论中的一个很好的补充:

4xx表示客户端的错误,可以由他们采取某种措施来修复,而5xx表示服务器上的问题,客户端无法解决。因此,在您的情况下,使用4xx更合适,因为(i)服务器的行为完全正确,并且(ii)客户端可以通过减慢速度或购买更多信用来“修复”错误。确切的分辨率可以在429响应的正文中指出。– Mike Chamberlain 7小时前


503!503!503!达到限制后,禁止再下一个电话。简单明了...
yannis'1

@YannisRizos:啊,但是一旦付款就不被禁止!
Marcin 2012年

1
错误代码表示单个请求的结果。如果付款了,那么在随后的请求中,一切照旧...如果您记录了这种行为,我可以接受。或者,您可能只返回200,并显示一条错误消息。但这不是很漂亮。尽管有人可能会说将HTTP错误代码用于业务逻辑并不是一件很漂亮的事情。嗯,我个人会使用503,目前暂时无法提供服务-当然,通常都支持402。
yannis 2012年

@YannisRizos(&Marcin)-感谢您的评论-我认为503是最好的选择;同时还了解到,在使用HTTP状态代码时,具有RESTful性质的实现通常容易犯规。我个人对此的看法是使用协议提供的内容,除非它不合适(实际上非​​常罕见)。在这种情况下,绝对可以!
安德拉斯·佐尔坦

5
4xx表示客户端的错误,可以由他们采取某种措施来修复,而5xx表示服务器上的问题,客户端无法解决。因此,在您的情况下,使用4xx更合适,因为(i)服务器的行为完全正确,并且(ii)客户端可以通过减慢速度或购买更多信用来“修复”错误。确切的分辨率可以在429响应的正文中指出。
Mike Chamberlain
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.