Ich habe eine Reihe von Ressourcen, deren Darstellungen träge erstellt werden. Die Berechnung zum Erstellen dieser Darstellungen kann je nach Serverlast, spezifischer Ressource und Mondphase zwischen einigen Millisekunden und einigen Stunden dauern.
Die erste für die Ressource empfangene GET-Anforderung startet die Berechnung auf dem Server. Wenn die Berechnung innerhalb weniger Sekunden abgeschlossen ist, wird die berechnete Darstellung zurückgegeben. Andernfalls wird der Statuscode 202 "Akzeptiert" zurückgegeben, und der Client muss die Ressource abfragen, bis die endgültige Darstellung verfügbar ist.
Der Grund für dieses Verhalten ist folgender: Wenn ein Ergebnis innerhalb weniger Sekunden verfügbar ist, muss es so schnell wie möglich abgerufen werden. Andernfalls ist es nicht wichtig, wann es verfügbar ist.
Aufgrund des begrenzten Speichers und des enormen Anforderungsvolumens sind weder NIO noch lange Abfragen eine Option ( dh ich kann nicht annähernd genug Verbindungen offen halten oder sogar alle Anforderungen in den Speicher einpassen; einmal "einige Sekunden" bestanden haben, ich bleibe bei den überschüssigen Anfragen). Ebenso sind die Client-Einschränkungen so, dass sie stattdessen keinen Abschlussrückruf verarbeiten können. Beachten Sie schließlich, dass ich nicht daran interessiert bin, eine "Factory" -Ressource zu erstellen, an die ein POST gesendet wird, da die zusätzlichen Roundtrips bedeuten, dass wir die stückweise Echtzeitbeschränkung mehr als gewünscht nicht erfüllen (außerdem ist es zusätzliche Komplexität; dies ist auch eine Ressource, die dies tun würde vom Caching profitieren).
Ich stelle mir vor, dass es einige Kontroversen über die Rückgabe eines 202 "Akzeptiert" -Statuscodes als Antwort auf eine GET-Anfrage gibt, da ich ihn in der Praxis noch nie gesehen habe und seine intuitivste Verwendung als Reaktion auf unsichere Methoden erfolgt, aber noch nie fand etwas speziell entmutigend. Bewahre ich nicht sowohl Sicherheit als auch Idempotenz?
Was denken die Leute über diesen Ansatz?
EDIT : Ich sollte erwähnen, dass dies für eine sogenannte Business Web API ist - nicht für Browser.
quelle
202
. Dass es in der Praxis selten verwendet wird, liegt meiner Meinung nach eher daran, dass sich nur wenige Webentwickler für die richtigen Statuscodes interessieren, da sie eher an die Interaktion zwischen Browser und Benutzeragenten gewöhnt sind. In diesem Fall202
gibt a ihnen keinen sichtbaren Hinweis (geben Sie ihnen ein200
und sie sind glücklich). ..).200
.202
ist das, was es sein soll , aber in der Praxis erwarten die Leute es nicht202
.Antworten:
Wenn es sich um eine gut definierte und dokumentierte API handelt,
202
klingt dies genau richtig für das, was passiert.Wenn es für das öffentliche Internet ist, wäre ich zu besorgt über die Client-Kompatibilität. Ich habe so viele
if (status == 200)
fest codierte gesehen ... In diesem Fall würde ich a zurückgeben200
.Außerdem gibt der RFC keinen Hinweis darauf, dass die Verwendung von 202 für eine GET-Anforderung falsch ist, während er in anderen Codebeschreibungen (z. B. 200) klare Unterschiede macht.
quelle
Wir haben dies für eine kürzlich durchgeführte Anwendung getan. Ein Client (benutzerdefinierte Anwendung, kein Browser) hat eine Abfrage gesendet, und der Server hat 202 mit einem URI an den "Job" zurückgegeben, der veröffentlicht wird. Der Client hat diesen URI verwendet, um nach dem abzufragen Ergebnis - dies scheint gut zu dem zu passen, was getan wurde.
Das Wichtigste dabei ist ohnehin, zu dokumentieren, wie Ihr Service / Ihre API funktioniert und was eine Antwort von 202 bedeutet.
quelle
Soweit ich mich erinnern kann, soll GET eine Ressource zurückgeben, ohne den Server zu ändern. Möglicherweise wird die Aktivität protokolliert oder was haben Sie, aber die Anforderung sollte mit demselben Ergebnis erneut ausgeführt werden können.
POST hingegen ist eine Anforderung, den Status von etwas auf dem Server zu ändern. Einfügen eines Datensatzes, Löschen eines Datensatzes, Ausführen eines Jobs, so etwas. 202 wäre für einen POST geeignet, der zurückgegeben wird, aber noch nicht fertig ist, aber nicht wirklich eine GET-Anforderung.
Es ist alles sehr puritanisch und in freier Wildbahn nicht gut geübt, daher sind Sie wahrscheinlich sicher, wenn Sie 202 zurückgeben. GET sollte 200 zurückgeben. POST kann 200 zurückgeben, wenn es fertig ist, oder 202, wenn es nicht fertig ist.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
quelle
Im Falle einer Ressource, die eine Darstellung einer Entität haben soll, die durch eine ID eindeutig angegeben ist (im Gegensatz zu einer "Factory" -Ressource, wie in der Frage beschrieben), empfehle ich, bei der GET-Methode zu bleiben und in a Wenn die Entität / Darstellung aufgrund einer verzögerten Erstellung oder einer anderen vorübergehenden Situation nicht verfügbar ist, verwenden Sie den Antwortcode 503 Service Unavailable, der geeigneter ist und tatsächlich für Situationen wie diese entwickelt wurde.
Gründe hierfür finden Sie in den RFCs für HTTP selbst (überprüfen Sie die Beschreibung des 503-Antwortcodes) sowie in zahlreichen anderen Ressourcen.
Bitte vergleichen Sie den HTTP-Statuscode für vorübergehend nicht verfügbare Seiten . Obwohl es sich bei dieser Frage um einen anderen Anwendungsfall handelt, bezieht sie sich tatsächlich auf genau die gleiche Funktion von HTTP.
quelle