Ich habe ein bisschen herumgestochert, aber ich sehe keinen HTTP-Statuscode, wenn eine Anfrage erfolgreich ist, aber nach dem "Point of no Return" ist ein Fehler aufgetreten.
Beispiel: Sie verarbeiten eine Anforderung, die an die Datenbank gebunden ist, aber während Sie das Ergebnis zurückgeben, wird der Speicher ausgeführt oder Sie stoßen auf eine NPE. Es wäre wäre eine 200
-Antwort gewesen, aber jetzt können Sie intern nicht die richtige, wohlgeformte Antwort zurückgeben.
202 Accepted
scheint nicht zu passen, da wir die Anfrage bereits bearbeitet haben.
Welcher Statuscode bedeutet "Erfolg, aber Fehler"? Gibt es einen überhaupt?
HTTP hat keinen solchen Statuscode, aber es gibt eine bewährte Methode, mit der Sie solche Situationen behandeln können - den Benutzer nach einer POST-Operation umzuleiten.
Hier ist ein Zusammenbruch -
So wird Ihr Anwendungsfall von "Gespeicherte Daten, die aber nicht sofort abgerufen werden können" in eine 302-Weiterleitung für den anfänglichen POST umgewandelt, gefolgt von einer 500 für das nachfolgende GET.
Dieser Ansatz hat noch andere Vorteile - Sie werden das lästige "Sind Sie sicher, dass Sie die Daten erneut einreichen wollen?" Botschaft. Außerdem werden die Schaltflächen zum Zurück / Vorwärts / Aktualisieren verwendet.
Wenn dem Server bekannt ist, dass ein Problem aufgetreten ist, sollte normalerweise ein 5xx-Fehler zurückgegeben werden. Der allgemeinste ist der 500 Server Error
, den der RFC 2616 wie folgt definiert:
500 Interner Serverfehler
Der Server hat einen unerwarteten Zustand festgestellt, der ihn verhindert hat von der Erfüllung der Anfrage.
Dann liegt es in der Verantwortung des Kunden, die Anfrage erneut zu versuchen. Wenn die vorherige Anforderung teilweise festgeschrieben wurde, liegt es in der Verantwortung des Servers (oder der Datenbank), diese zurückzusetzen oder die doppelte Transaktion entsprechend zu behandeln.
Ich stimme @Daniel zu, dass die richtige Antwort ein HTTP 500 (Serverfehler) ist. Die Webanwendung muss geschrieben werden, um die Transaktion bei einem Fehler rückgängig zu machen, die Dinge nicht halbfertig zu lassen.
Eine Sache, die Sie in Ihrer Webanwendung nutzen können, ist "Idempotenz". Dies ist die Eigenschaft einer Funktion (oder Operation), dass Sie sie mit demselben Ergebnis beliebig oft wiederholen können. Zum Beispiel, wenn ein Lesen fehlschlägt, kann der Client es einfach wiederholen, bis es erfolgreich ist. Wenn ein Löschvorgang fehlschlägt, kann der Client es erneut versuchen, und der Server behandelt die Anforderung als gültig, unabhängig davon, ob die gelöschte Ressource bereits gelöscht wurde oder nicht. Und wenn ein Update fehlschlägt, kann der Client dies wiederholen, bis eine erfolgreiche Rückkehr vom Server erfolgt. Der REST-Ansatz für die Architektur von Web-Services nutzt Idempotenz, um Operationen angesichts von Fehlern robust zu machen.
Tags und Links rest http http-status-codes