Ich bin an einer Kreuzung mit einigen API-Design für einen Client (JS in einem Browser), um mit einem Server zu sprechen. Wir verwenden HTTP 409-Konflikt, um das Fehlschlagen einer Aktion aufgrund einer aktivierten Sicherheitssperre darzustellen. Das Satefy-Schloss verhindert, dass Entwickler versehentlich Änderungen an den Produktionssystemen unserer Kunden vornehmen. Ich wurde damit beauftragt, 409s auf dem Client etwas eleganter zu behandeln, um anzuzeigen, warum ein bestimmter API-Aufruf fehlgeschlagen ist.
Meine Lösung bestand darin, die Fehlerbehandlungsroutinen aller unserer AJAX-Aufrufe zu bündeln, die eine Benachrichtigung auf dem Client anzeigen, wenn aufgrund von 409 etwas ausfällt. Dies ist in Ordnung und funktioniert gut zusammen mit anderen 4XX- und 5XX-Fehlern, die denselben Mechanismus verwenden.
Es ist ein Problem aufgetreten, bei dem einer unserer Route-Handler auf einen Fehler in der Geschäftslogik mit 409s reagiert. Mein AJAX-Wrapper meldet, dass die Sicherheitssperre aktiviert ist, während der vorhandene Failure-Handler des Clients meldet, was (seiner Meinung nach) das Problem auf dem Körper basiert der Antwort. Eine einfache Lösung wäre, entweder die Antwort des Handlers oder den Statuscode zu ändern, den wir zur Darstellung des Sicherheitsschlosses verwenden.
Was mich an den Scheideweg bringt: Sollen HTTP-Statuscodes überhaupt zur Darstellung von Fehlern in der Geschäftslogik verwendet werden? Diese Frage befasst sich mit dem gleichen Problem, mit dem ich konfrontiert bin, hat aber nicht viel Anklang gefunden. Wie in der verknüpften Antwort vorgeschlagen, neige ich dazu, HTTP 200 OK mit einem geeigneten Textkörper zu verwenden, um Fehler in der Geschäftslogik darzustellen.
Hat hier jemand eine starke Meinung? Kann mich jemand davon überzeugen, dass dies der falsche Weg ist, ein Versagen darzustellen?
400 Bad Request
. Der Grund für diese Trennung ist, dass zukünftige Systeme, Entwickler oder Leser von Dokumenten durch Ihre Abweichung vom weltweiten Standard verwirrt werden können.400 Bad Request
als Decke HTTP-Code scheint am besten, um Business-Logik-Fehler als Klasse abzudecken.400 Bad Request
wenn Daten fehlen oder nicht gelesen / analysiert werden können. Dh die Anforderungsdaten selbst sind in irgendeiner Weise schlecht.Antworten:
Kasey deckt den Hauptpunkt ab.
Die Schlüsselidee in jeder Web-API: Sie passen Ihre Domain so an, dass sie wie ein Dokumentenspeicher aussieht. GET / PUT / POST / DELETE usw. sind alle Arten der Interaktion mit dem Dokumentenspeicher.
So eine Art des Denkens über das, was Codes zu verwenden, ist zu verstehen , was die analoge Operation in einem Dokumentenspeicher ist, und was diese Fehler wie in diesen analogen aussehen würden.
2xx ist völlig ungeeignet
5xx ist auch ungeeignet
In diesem Fall hat der Server keinen Fehler gemacht. Es ist bekannt, dass Sie diese Ressource derzeit nicht auf diese Weise ändern sollten.
Fehler in der Geschäftslogik (was bedeutet, dass die Geschäftsinvariante die vorgeschlagene Bearbeitung zu diesem Zeitpunkt nicht zulässt) sind wahrscheinlich 409
Beachten Sie das letzte Bit: Die Nutzlast der Antwort 409 sollte dem Verbraucher Informationen über die aufgetretenen Probleme übermitteln und im Idealfall Hypermedia-Steuerelemente enthalten, die den Verbraucher zu den Ressourcen führen, die zur Lösung des Konflikts beitragen können.
Und ich würde darauf als das Problem hinweisen; Ihre Implementierung beim Kunden ging davon aus, dass der Statuscode ausreicht, um das Problem zu definieren. Stattdessen sollte Ihr Client-Code die Nutzdaten überprüfen und auf die dort verfügbaren Informationen reagieren.
So würde es immerhin ein Dokumentenspeicher tun
Der gleiche Ansatz mit a
400 Bad Request
wäre auch akzeptabel; was ungefähr "übersetzt in" bedeutet. Bei Ihrer Anfrage ist ein Problem aufgetreten. Wir müssen nicht herausfinden, welcher Statuscode am besten zu Ihnen passt. Einzelheiten finden Sie in der Nutzlast. "Die WebDAV-Spezifikation enthält diese Empfehlung
Ich glaube nicht, dass das ganz passend ist (obwohl ich zustimme, dass es
400
als Alternative einige Zweifel aufwirft). Meine Interpretation ist, dass422
"Sie haben die falsche Entität gesendet", wohin409
"Sie haben die Entität zur falschen Zeit gesendet".Anders ausgedrückt:
422
Weist auf ein Problem mit der Anforderungsnachricht409
hin, das isoliert betrachtet wird, und weist darauf hin, dass die Anforderungsnachricht mit dem aktuellen Status der Ressource in Konflikt steht.Die Diskussion von Ben Nadal über 422 kann nützlich sein, um darüber nachzudenken.
quelle
Nach meiner Erfahrung reichen HTTP-Fehlercodes nicht aus, um Geschäftsfehler darzustellen. Sie sind jedoch nützlich, um Fehlerklassen darzustellen.
Daher würde ich empfehlen, HTTP-Fehlercodes für Fehlerkategorien zu verwenden, aber einen bestimmten Fehler für Geschäftslogikfehler auszuwählen (z. B. 409 Konflikt ... 200 OK würde hier irreführend sein) und Daten in die Antwort aufzunehmen, die den bestimmten Geschäftsfehler angeben . Stellen Sie sicher, dass dies Teil des Antwortinhalts und nicht des Statustexts ist, da einige Browser benutzerdefinierten Statustext ignorieren. Die Sprache, die ich gerne verwende, verfügt über Unionstypen, die sich zur Darstellung von Nachrichten eignen. Sie können aber auch String-Konstanten für Fehlerfälle definieren.
Beispiele
quelle
Im Allgemeinen würde ich die Verwendung von HTTP-Statuscodes vermeiden, um bestimmte Geschäftslogikfehler darzustellen. Dies liegt daran, dass sie bereits eine semantische Bedeutung haben, die durch den weltweiten Standard definiert wird. Andere Systeme, neue Entwickler usw. werden durch Ihre Abweichung vom Standard verwirrt.
Was ich in jüngster, ähnlicher Forschung herausgefunden habe, war, dass es allgemein akzeptiert wird, es
400 Bad Request
im Falle von Validierungsfehlern und dergleichen zu verwenden. Auf diese Weise verwenden Sie einen Statuscode für alle Geschäftslogikfehler.Sollte übrigens
409
verwendet werden, wenn sich eine Ressource geändert hat, während Sie sie bearbeitet und erneut gespeichert haben.quelle
Sie können "Bad Request" verwenden und die ID der verletzten Geschäftsregel sowie einige weitere Details zum Hauptteil der Antwort angeben.
quelle