HTTP-Statuscode für "Erfolg mit Fehlern"?

8

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?

    
Richard Levasseur 18.06.2010, 03:06
quelle

3 Antworten

4

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 -

  1. Eine POST-Anfrage versucht, Daten auf dem Server zu ändern
  2. Wenn der Server fehlschlägt, wird ein 500-Fehler gesendet, um einen Fehler anzuzeigen
  3. Wenn der Server erfolgreich ist, sendet er eine 302-Weiterleitungsantwort
  4. Der Browser sendet dann eine neue GET-Anfrage an den Server
  5. Wenn dies fehlschlägt, erhalten Sie einen Fehler von 500, andernfalls erhalten Sie 200

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.

    
Sripathi Krishnan 18.06.2010 05:40
quelle
3

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.

    
Daniel Vassallo 18.06.2010 03:14
quelle
1

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.

    
Jim Ferrans 18.06.2010 03:45
quelle

Tags und Links