Sugerowany kod statusu REST HTTP dla „osiągnięto limit żądań”

43

Przygotowuję specyfikację dla usługi REST, której część będzie obejmować możliwość dławienia użytkowników w całej usłudze oraz na grupach lub na poszczególnych zasobach. Podobnie limity czasowe dla nich byłyby konfigurowalne dla zasobu / grupy / usługi.

Właśnie przeglądam specyfikację HTTP 1.1 i próbuję zdecydować, w jaki sposób powiadomię klienta, że ​​żądanie nie zostanie zrealizowane, ponieważ osiągnęło limit.

Początkowo doszedłem do wniosku, że kod klienta 403 - Forbiddenjest tym, ale ze specyfikacji:

Autoryzacja nie pomoże, a prośba NIE POWINNA zostać powtórzona

przeszkadzało mi to.

Wydaje się, że 503 - Service Unavailablejest to lepsze rozwiązanie, ponieważ pozwala na komunikację czasu ponownej próby za pomocą Retry-Afternagłówka.

Możliwe, że w przyszłości będę mógł poprzeć „kupowanie” większej liczby żądań za pośrednictwem eCommerce (w takim przypadku byłoby miło, gdyby kod klienta 402 - Payment Requiredzostał sfinalizowany!) - ale sądzę, że można to również wcisnąć w odpowiedź 503.

Jak myślisz, którego powinienem użyć? Czy jest jeszcze jeden, którego nie rozważałem?

Andras Zoltan
źródło

Odpowiedzi:

77

429 Zbyt wiele wniosków

Użytkownik wysłał zbyt wiele żądań w danym czasie. Przeznaczony do użytku z programami ograniczającymi stawki. Ten kod został zaakceptowany w dodatkowych kodach stanu HTTP RFC 6585 .

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...
Sean McMillan
źródło
Brzmi niesamowicie - będę o tym pamiętać! Czy pochodzi z darmowymi kotami? A może są rozszerzeniem protokołu?
Andras Zoltan
3
Koty ze statusem HTTP - dla wszystkich twoich potrzeb związanych ze statusem: flickr.com/photos/girliemac/sets/72157628409467125
Sean McMillan
1
który właśnie obrócił się w biurze do wielu śmiechu i oklasków - geniusz!
Andras Zoltan
W końcu poszedłem z 429 - jest w specyfikacji roboczej, ale poważnie wątpię, że ostatecznie zostanie wykorzystany do czegokolwiek innego.
Andras Zoltan
7

Do pewnego stopnia możesz robić, co chcesz, z kodami, ale zgodziłbym się, że możesz użyć 503, lub jeśli chcesz 402, nikt nie może narzekać, że psujesz rzeczy.

Edycja: purysta może powiedzieć, że powinieneś zacząć od 503, a następnie zmienić, kiedy będzie można dokonać płatności.


Doskonały dodatek do tego w komentarzach:

4xx oznacza błąd klienta, który można naprawić, podejmując określone działanie, a 5xx oznacza problem na serwerze, którego klient nie może rozwiązać. Więc w twoim przypadku bardziej odpowiednia jest wersja 4xx, ponieważ (i) serwer zachowuje się dokładnie tak, jak powinien, oraz (ii) klient może „naprawić” błąd poprzez spowolnienie lub zakup większej liczby kredytów. Dokładna rozdzielczość może być wskazana w treści odpowiedzi 429. - Mike Chamberlain 7 godzin temu

Marcin
źródło
503! 503! 503! Po osiągnięciu limitu następne połączenie jest zabronione. Proste i proste ...
yannis
@YannisRizos: Ach, ale nie jest to zabronione po dokonaniu płatności!
Marcin
1
Kod błędu reprezentuje wynik pojedynczego żądania. Jeśli płatność została dokonana, to na kolejne żądanie działa jak zwykle ... Jeśli udokumentujesz to zachowanie, to jest dla mnie w porządku. Możesz też zwrócić 200, z komunikatem o błędzie. Ale to nie jest ładne. Chociaż niektórzy mogą powiedzieć, że używanie kodów błędów HTTP w logice biznesowej nie jest ładne. No cóż, osobiście wybrałbym 503, usługa nie jest w tej chwili dostępna - dopóki oczywiście 402 nie jest powszechnie obsługiwany.
yannis
@YannisRizos (i Marcin) - dzięki za komentarze - uznałem, że najlepszym wyborem jest 503; przy jednoczesnym zrozumieniu, że implementacje o charakterze RESTful często nie są w porządku, gdy są wełniane, jeśli chodzi o użycie kodów stanu HTTP. Moim osobistym punktem widzenia jest wykorzystanie tego, co zapewnia protokół, chyba że nie pasuje (co w rzeczywistości jest bardzo rzadkie). W tym przypadku zdecydowanie tak!
Andras Zoltan
5
4xx oznacza błąd klienta, który można naprawić, podejmując określone działanie, a 5xx oznacza problem na serwerze, którego klient nie może rozwiązać. Więc w twoim przypadku bardziej odpowiednia jest wersja 4xx, ponieważ (i) serwer zachowuje się dokładnie tak, jak powinien, oraz (ii) klient może „naprawić” błąd poprzez spowolnienie lub zakup większej liczby kredytów. Dokładna rozdzielczość może być wskazana w treści odpowiedzi 429.
Mike Chamberlain