Ich frage mich, ob es richtig ist, zurückzukehren, HTTP 200 OK
wenn auf der Serverseite ein Fehler aufgetreten ist (die Fehlerdetails wären im Antworttext enthalten).
Beispiel:
- Wir senden
HTTP GET
- Auf der Serverseite ist etwas Unerwartetes passiert.
- Server gibt
HTTP 200 OK
Statuscode mit Fehlern in einer Antwort (z{"status":"some error occurred"}
)
Ist das das richtige Verhalten oder nicht? Sollten wir den Statuscode auf etwas anderes als 200 ändern?
Antworten:
Nein, das ist sehr falsch.
HTTP ist ein Anwendungsprotokoll. 200 impliziert, dass die Antwort eine Nutzlast enthält, die den Status der angeforderten Ressource darstellt. Eine Fehlermeldung ist normalerweise keine Darstellung dieser Ressource.
Wenn während der Verarbeitung von GET etwas schief geht, lautet der richtige Statuscode 4xx ("Sie haben es vermasselt") oder 5xx ("Ich habe es vermasselt").
quelle
HTTP-Statuscodes sagen etwas über das HTTP-Protokoll aus.
HTTP 200
bedeutet, dass die Übertragung auf HTTP-Ebene in Ordnung ist (dh die Anfrage war technisch in Ordnung und der Server konnte ordnungsgemäß antworten). Auf dieser Wiki-Seite finden Sie eine Liste aller Codes und ihrer Bedeutung.HTTP 200 hat nichts mit Erfolg oder Misserfolg Ihres "Geschäftscodes" zu tun. In Ihrem Beispiel
HTTP 200
ist dies ein akzeptabler Status, der angibt, dass Ihre "Business Code-Fehlermeldung" erfolgreich übertragen wurde, vorausgesetzt, keine technischen Probleme verhinderten die ordnungsgemäße Ausführung der Geschäftslogik.Alternativ können Sie Ihren Server antworten lassen,
HTTP 5xx
wenn technische oder nicht behebbare Probleme auf dem Server aufgetreten sind. OderHTTP 4xx
wenn die eingehende Anforderung Probleme hatte (z. B. falsche Parameter, unerwartete HTTP-Methode ...). Diese weisen wiederum auf technische Fehler hin, während KEINE technischen FehlerHTTP 200
angezeigt werden, übernehmen jedoch keine Garantie für Geschäftslogikfehler.Zusammenfassend: JA, es ist gültig, Fehlermeldungen (für nicht technische Probleme) in Ihrer http-Antwort zusammen mit dem HTTP-Status 200 zu senden. Ob dies für Ihren Fall gilt, liegt bei Ihnen. Wenn der Client beispielsweise nach einer Datei fragt, die nicht vorhanden ist, ähnelt dies eher einer
404
. Wenn auf dem Server eine Fehlkonfiguration vorliegt, kann dies eine sein500
. Wenn der Kunde nach einem Sitzplatz in einem ausgebuchten Flugzeug fragt, ist dies der Fall,200
und Ihre "Implementierung" bestimmt, wie dies erkannt / gehandhabt werden soll (z. B. JSON-Block mit a{ "booking","failed" }
).quelle
{"booking":"failed","reason":"plane is full"}
. Es ist vollkommen in Ordnung, ein HTTP 200 zu erhalten, tatsächlich (IMHO) wäre dies der EINZIGE gültige HTTP-Statuscode.Selbst wenn ich einen Geschäftslogikfehler als HTTP-Code zurückgeben möchte, gibt es keinen solchen akzeptablen HTTP-Fehlercode für diese Fehler, anstatt HTTP 200 zu verwenden, da dadurch der tatsächliche Fehler falsch dargestellt wird.
HTTP 200 ist also gut für Fehler in der Geschäftslogik. Alle Fehler, die durch HTTP-Fehlercodes abgedeckt sind, sollten diese verwenden.
Grundsätzlich bedeutet HTTP 200, welcher Server die Benutzeranfrage korrekt verarbeitet (falls keine Sitzplätze im Flugzeug vorhanden sind, spielt es keine Rolle, dass die Benutzeranforderung korrekt verarbeitet wurde, und es kann sogar nur eine Anzahl verfügbarer Sitzplätze im Flugzeug zurückgegeben werden Es gibt überhaupt keine Geschäftslogikfehler oder diese Geschäftslogik kann sich auf der Clientseite befinden. Geschäftslogikfehler sind eine abstrakte Bedeutung, aber HTTP-Fehler sind eindeutiger.
quelle
Zur Verdeutlichung sollten Sie HTTP-Fehlercodes verwenden, sofern diese zum Protokoll passen, und keine HTTP-Statuscodes zum Senden von Geschäftslogikfehlern verwenden .
Fehler wie unzureichendes Gleichgewicht , keine Kabinen verfügbar , fehlerhafter Benutzer / Passwort qualifizieren sich für den HTTP-Status
200
mit anwendungsspezifischer Fehlerbehandlung im Antworttext.Siehe diese Software-Engineering-Antwort :
quelle
Ich denke, die Leute haben der Anwendungslogik gegenüber der Protokollsache zu viel Gewicht beigemessen. Wichtig ist, dass die Antwort sinnvoll ist. Was ist, wenn Sie eine API haben, die eine dynamische Ressource bedient, und eine Anforderung für X gestellt wird, die von der Vorlage Y mit Daten Z abgeleitet ist und entweder Y oder Z derzeit nicht verfügbar sind? Ist das ein Geschäftslogikfehler oder ein technischer Fehler? Die richtige Antwort lautet: "Wen interessiert das?"
Ihre API und Ihre Antworten müssen verständlich und konsistent sein. Es sollte einer Spezifikation entsprechen und diese Spezifikation sollte definieren, was eine gültige Antwort ist. Etwas, das einer gültigen Antwort entspricht, sollte einen 200-Code ergeben. Etwas, das nicht einer gültigen Antwort entspricht, sollte einen 4xx- oder 5xx-Code ergeben, der angibt, warum keine gültige Antwort generiert werden konnte.
Wenn die Definition einer gültigen Antwort in Ihrer Spezifikation dies zulässt
{ "error": "invalid ID" }
, ist die Antwort erfolgreich. Wenn Ihre Spezifikation diese Anpassung nicht vornimmt, wäre es eine schlechte Entscheidung, diese Antwort mit einem 200-Code zurückzugeben.Ich würde eine Analogie zum Aufrufen einer Funktion ziehen
parseFoo
. Was passiert, wenn Sie anrufenparseFoo("invalid data")
? Gibt es ein Fehlerergebnis zurück (möglicherweise null)? Oder wirft es eine Ausnahme? Viele werden eine fast religiöse Position einnehmen, ob der eine oder der andere Ansatz korrekt ist, aber letztendlich liegt es an der API-Spezifikation.Offensichtlich gibt es Meinungsverschiedenheiten darüber, ob die "erfolgreiche Rückgabe eines Fehlers" einen HTTP-Erfolg oder -Fehler darstellt. Ich sehe verschiedene Leute, die die gleichen Spezifikationen unterschiedlich interpretieren. Wählen Sie also eine Seite, aber akzeptieren Sie auch, dass die ganze Welt Ihnen nicht zustimmen wird. Mich? Ich befinde mich irgendwo in der Mitte, aber ich werde einige vernünftige Überlegungen anstellen.
500 Internal Server Error
. Dies scheint die Situation von OP zu sein. Die Anwendung sollte a nicht200
für unerwartete Fehler zurückgeben, sondern auch Punkt 3.In der Situation von OP klingt es so, als hätten Sie einen De-facto-Standard, bei dem nicht behandelte Ausnahmen eine 200 mit einem unterscheidbaren Antwortkörper ergeben. Es ist nicht ideal, aber wenn es nicht kaputt geht und aktiv Probleme verursacht, müssen Sie wahrscheinlich größere, wichtigere Probleme lösen.
quelle
HTTP Ist das Protokoll für die Übertragung von Daten über das Internet.
Wenn diese Übertragung aus irgendeinem Grund unterbrochen wird, erfahren Sie anhand der HTTP-Fehlercodes, warum sie nicht an Sie gesendet werden kann.
Die übertragenen Daten werden nicht von HTTP-Fehlercodes verarbeitet. Nur die Übertragungsmethode.
HTTP kann nicht sagen "Ok, diese Antwort ist Gobbledigook, aber hier ist es". es sagt nur
200 OK
.dh: Ich habe meine Aufgabe erledigt, es zu Ihnen zu bringen, der Rest liegt bei Ihnen.
Ich weiß, dass dies bereits beantwortet wurde, aber ich habe es in Worte gefasst, die ich verstehen kann. Entschuldigung für jede Wiederholung.
quelle
Ich denke, diese Art von Problemen ist gelöst, wenn wir über das wirkliche Leben nachdenken.
Schlechte Praxis:
Beispiel 1:
Beispiel 2:
Gute Praktiken:
Dies ist nur meine persönliche Meinung, jeder kann sie so umsetzen, wie es am bequemsten ist oder am nötigsten ist.
Hinweis: Die Idee für diese Erklärung stammt von einem großartigen Freund @diosney
quelle