Vorgeschlagener HTTP-REST-Statuscode für "Anforderungslimit erreicht"

43

Ich stelle eine Spezifikation für einen REST-Service zusammen, der zum Teil die Möglichkeit beinhaltet, Benutzer dienstweit und für Gruppen oder für einzelne Ressourcen zu drosseln. Ebenso können Zeitüberschreitungen für diese pro Ressource / Gruppe / Service konfiguriert werden.

Ich schaue mir nur die HTTP 1.1-Spezifikation an und versuche zu entscheiden, wie ich einem Client mitteilen möchte, dass eine Anforderung nicht erfüllt wird, weil er sein Limit erreicht hat.

Anfangs dachte ich, dass der Client-Code 403 - Forbiddenderjenige ist, aber dies aus der Spezifikation:

Die Autorisierung hilft nicht und die Anfrage SOLLTE NICHT wiederholt werden

störte mich.

Tatsächlich scheint 503 - Service Unavailablees besser zu sein, dies zu verwenden, da es die Kommunikation einer Wiederholungszeit durch die Verwendung des Retry-AfterHeaders ermöglicht.

Es ist möglich, dass ich in Zukunft versuchen werde, mehr Anfragen über E-Commerce zu "kaufen" (in diesem Fall wäre es schön, wenn der Client-Code 402 - Payment Requiredfinalisiert worden wäre!) - aber ich denke, dass dies auch zu einer 503-Antwort werden könnte.

Was denkst du, sollte ich verwenden? Oder gibt es eine andere, an die ich nicht gedacht habe?

Andras Zoltan
quelle

Antworten:

77

429 Zu viele Anfragen

Der Benutzer hat in einem bestimmten Zeitraum zu viele Anfragen gesendet. Bestimmt für die Verwendung mit Ratenbegrenzungsschemata. Dieser Code wurde in RFC 6585 Zusätzliche HTTP- Statuscodes akzeptiert .

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
quelle
Klingt großartig - ich werde es im Hinterkopf behalten! Kommt es mit kostenlosen Katzen? Oder sind sie eine Erweiterung des Protokolls?
Andras Zoltan
3
HTTP Status Katzen - für alle Ihre Statusbedürfnisse: flickr.com/photos/girliemac/sets/72157628409467125
Sean McMillan
1
das hat gerade im büro viel gelacht und applaudiert - genial!
Andras Zoltan
Ich habe am Ende einen 429 gewählt - er ist in der Entwurfsspezifikation enthalten, aber ich bezweifle ernsthaft, dass er für irgendetwas anderes verwendet wird.
Andras Zoltan
7

Bis zu einem gewissen Grad können Sie mit den Codes tun, was Sie möchten, aber ich stimme zu, dass Sie sie verwenden 503können oder wenn Sie möchten 402, ohne dass sich jemand beschweren kann, dass Sie etwas kaputt machen.

Bearbeiten: Ein Purist könnte sagen, dass Sie mit 503 beginnen und dann wechseln sollten, sobald es möglich ist, Zahlungen zu leisten.


Eine hervorragende Ergänzung dazu in den Kommentaren:

Ein 4xx zeigt einen Fehler des Clients an, der behoben werden kann, indem er eine bestimmte Aktion ausführt, während ein 5xx ein Problem auf dem Server anzeigt, bei dessen Behebung der Client nicht helfen kann. In Ihrem Fall ist ein 4xx besser geeignet, da sich (i) der Server genau so verhält, wie er sollte, und (ii) der Client den Fehler "beheben" kann, indem er entweder verlangsamt oder mehr Credits kauft. Die genaue Auflösung kann im Hauptteil der Antwort 429 angegeben werden. - Mike Chamberlain vor 7 Stunden

Marcin
quelle
503! 503! 503! Das Limit erreicht, der nächste Anruf ist verboten. Schlicht und einfach ...
Yannis
@YannisRizos: Ah, aber es ist nicht verboten, sobald die Zahlung erfolgt ist!
Marcin
1
Der Fehlercode repräsentiert das Ergebnis der Einzelanfrage. Wenn die Zahlung geleistet wurde, ist es auf eine spätere Anfrage üblich ... Wenn Sie das Verhalten dokumentieren, ist es in Ordnung von mir. Oder Sie geben einfach 200 mit einer Fehlermeldung zurück. Aber das ist nicht hübsch. Obwohl einige sagen könnten, dass die Verwendung von HTTP-Fehlercodes für die Geschäftslogik nicht schön ist. Naja, ich persönlich würde 503 wählen, der Service ist momentan nicht verfügbar - bis natürlich 402 allgemein unterstützt wird.
Yannis
@YannisRizos (& Marcin) - danke für deine Kommentare - ich dachte, 503 wäre das Beste für dich; Gleichzeitig ist klar, dass Implementierungen mit REST-Charakter oft unangenehm sind, wenn es um die Verwendung von HTTP-Statuscodes geht. Mein persönlicher Standpunkt dazu ist, das zu verwenden, was das Protokoll bietet, sofern es nicht passt (was eigentlich sehr selten ist). In diesem Fall ist das definitiv der Fall!
Andras Zoltan
5
Ein 4xx zeigt einen Fehler des Clients an, der behoben werden kann, indem er eine bestimmte Aktion ausführt, während ein 5xx ein Problem auf dem Server anzeigt, bei dessen Behebung der Client nicht helfen kann. In Ihrem Fall ist ein 4xx besser geeignet, da sich (i) der Server genau so verhält, wie er sollte, und (ii) der Client den Fehler "beheben" kann, indem er entweder verlangsamt oder mehr Credits kauft. Die genaue Auflösung kann im Hauptteil der Antwort 429 angegeben werden.
Mike Chamberlain