Запропонований код статусу HTTP REST для "досягнуто ліміту запиту"


43

Я збираю специфікацію для REST-сервісу, частина якого буде включати можливість перешкоджати користувачам сервісу на всій основі та на групи або на окремі ресурси. У рівній мірі, тайм-аути для них можна налаштувати на ресурс / групу / послугу.

Я просто переглядаю специфікацію HTTP 1.1 і намагаюся вирішити, як мені повідомити клієнту, що запит не буде виконаний, оскільки вони досягли своєї межі.

Спочатку я зрозумів, що клієнтський код 403 - Forbiddenбув одним, але це, з специфікації:

Авторизація не допоможе, і запит НЕ повинен повторюватися

турбував мене.

Насправді, здається, що 503 - Service Unavailableце кращий варіант використання, оскільки він дозволяє передавати час повторного часу за допомогою Retry-Afterзаголовка.

Цілком можливо, що в майбутньому я можу погодитися підтримати «купівлю» більше запитів за допомогою електронної комерції (у цьому випадку було б добре, якби клієнтський код 402 - Payment Requiredбуло доопрацьовано!) - але я вважаю, що це також можна було б втиснути у відповідь 503.

Що, на вашу думку, я повинен використовувати? Або є інша, яку я не розглядав?

Відповіді:


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 Status кошки - для всіх ваших статусних потреб: flickr.com/photos/girliemac/sets/72157628409467125
Шон Макмілан

1
що щойно обійшов офіс на багато сміху та оплесків - геніальний!
Андрас Золтан

Зрештою, я поїхав з 429 - це в проекті специфікації, але я серйозно сумніваюся, що в кінцевому підсумку він буде використаний для чого-небудь іншого.
Андрас Золтан

7

До певної міри ви вільні робити те, що вам подобається, з кодами, але я погоджуюся, що ви можете користуватися 503або, якщо хочете 402, без того, щоб хтось міг поскаржитися, що ви ламаєте речі.

Редагувати: пурист може сказати, що слід починати з 503, а потім перемикатися, як тільки можна здійснювати платежі.


Відмінне доповнення до цього в коментарях:

4xx вказує на помилку клієнта, яку він може виправити, вчинивши певні дії, тоді як 5xx вказує на проблему на сервері, яку клієнт не може допомогти вирішити. Тож у вашому випадку 4xx є більш доречним, оскільки (i) сервер веде себе так, як слід, і (ii) клієнт може "виправити" помилку, або сповільнивши або придбавши більше кредитів. Точна роздільна здатність може бути вказана в тілі відповіді 429. - Майк Чемберлен 7 годин тому


503! 503! 503! Досягнувши ліміту, наступний дзвінок заборонений. Простий і простий ...
yannis

@YannisRizos: А-а, але це не заборонено, як тільки платіж буде здійснено!
Марцін

1
Код помилки представляє результат одного запиту. Якщо оплата була здійснена, то за подальшим запитом це буде справа, як зазвичай ... Якщо ви документуєте поведінку, я це добре. Або ви могли просто повернути 200 із повідомленням про помилку. Але це не дуже. Хоча деякі можуть сказати, що використання кодів помилок HTTP для логіки бізнесу не дуже. Ну добре, я особисто поїхав би з 503, сервіс наразі недоступний - поки звичайно 402 не підтримується.
янніс

@YannisRizos (& Marcin) - дякую за ваші коментарі - я вважав, що 503 - найкращий варіант; в той же час розуміючи, що реалізація RESTful характеру часто може занепадати, якщо вони стосуються використання кодів статусу HTTP. Моя особиста точка зору на це полягає в тому, щоб використовувати те, що пропонує протокол, якщо це не відповідає (що насправді дуже рідко). У цьому випадку це безумовно так!
Андрас Золтан

5
4xx вказує на помилку клієнта, яку він може виправити, вчинивши певні дії, тоді як 5xx вказує на проблему на сервері, яку клієнт не може допомогти вирішити. Тож у вашому випадку 4xx є більш доречним, оскільки (i) сервер веде себе так, як слід, і (ii) клієнт може "виправити" помилку, або сповільнивши або придбавши більше кредитів. Точна роздільна здатність може бути вказана в тілі відповіді 429.
Майк Чемберлен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.