2010-06-18 3 views
8

Ich habe ein wenig herumgestochert, aber ich sehe keinen HTTP-Status-Code für, wenn eine Anfrage erfolgreich ist, aber es gibt einen Fehler nach dem "Point of No Return".HTTP-Statuscode für "Erfolg mit Fehlern"?

Beispiel: Sie verarbeiten eine Anfrage, die an die Datenbank übergeben wird, aber während Sie das Ergebnis zurückliefern, führen Sie Speicher aus, oder Sie stoßen auf eine NPE oder was Sie haben. Es würde eine 200 Antwort gewesen sein, aber jetzt intern sind Sie nicht in der Lage, die richtige, wohlgeformte Antwort zurückzugeben.

202 Accepted scheint nicht zu passen, da wir die Anfrage bereits bearbeitet haben.

Welcher Statuscode bedeutet "Erfolg, aber Fehler"? Gibt es einen überhaupt?

+0

In diesem Fall müssen Sie sicher sein, Sie nicht bereits einige Daten an den Client gesendet haben, denn dann haben Sie bereits den Punkt ohne Wiederkehr vergangen: bevor die ersten Bytes von Daten die Header (einschließlich der Statuscode) sind an den Browser gesendet. –

+0

Heh - gewährt :). Ich denke, ich spreche über den Punkt der Rückkehr vor diesem Punkt der Rückkehr. Die meiste Zeit jedoch baut serverseitiger Code vor dem Senden die volle Antwort im Speicher auf, da sie normalerweise klein genug ist, um dies zu tun. –

Antwort

3

Wenn dem Server bekannt ist, dass ein Problem aufgetreten ist, sollte normalerweise ein 5xx-Fehler zurückgegeben werden. Die allgemeinste ist die 500 Server Error, die die RFC 2616 definiert wie folgt: Fehler Interne

500 Server

Der Server hat einen unerwarteten Zustand, der es von der Erfüllung der Anforderung verhindert.

Dann ist es die 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.

+1

Ich bin nicht wirklich zufrieden mit dieser Antwort. Was bedeutet "erfüllen" genau? Wir haben die Ressource auf die vom Kunden gewünschte Weise geändert. Wenn sie die Seite neu laden, sehen sie die Änderungen. Soweit der Benutzer betroffen ist, war es erfolgreich. Für mich klingt es wirklich so, als hätten wir die _request_ erfüllt, aber _response_ nicht erfüllt. –

+0

@ Richard: Ich habe immer verstanden „erfüllen“, um die Reaktion umfassen auch (aber ich könnte auf diese falsch sein). Dieser Statuscode ist jedoch sehr allgemein gehalten und sollte immer dann verwendet werden, wenn der Server ein Problem feststellt, das nicht durch einen anderen spezifischen 5xx-Fehler beschrieben werden kann. Ich denke, [@ Jim] (http://stackoverflow.com/users/45935/jim-ferrans) beschrieben, was ich bestimmt besser zu sagen, [in der anderen Antwort] (http://stackoverflow.com/questions/3066972/ http-Status-Code-für-Erfolg-mit-Fehlern/3067090 # 3067090). –

1

Ich stimme @Daniel, 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 und die Dinge nicht zur Hälfte fertig zu stellen.

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 zur Architektur von Web-Services nutzt Idempotenz, um Operationen angesichts von Fehlern robust zu machen.

+0

Um zu klären, wird die Transaktion bereits begangen (beispielsweise den Fall betrachtet, wenn OutOfMemoryError bei der Codierung der Antwort auftritt). Um Idempotenz zu implementieren, müssten Sie Revisionskontrolle implementieren, nein? Den Server behalten, die übermittelten Änderungen und Klienten behalten und ID ändern. Es gibt auch den Fall der Behandlung nicht-temporärer Fehler (sagen wir, es gibt einen Fehler, der zu einem NPE anstelle eines nicht ausreichenden Speicherfehlers führt) - der Client kann alles wiederholen, was er möchte, aber es wird niemals erfolgreich sein das erste Mal, und die folgenden Zeiten sind redundant). –

+0

@Richard: Es "kommt drauf an". Wenn es sich um eine Content-Management-App handelt und es Ihnen nichts ausmacht, wenn gelegentlich zwei "gleichzeitige" Updates gelegentlich in strikter Reihenfolge auftreten, müssen Sie keine Versionierung durchführen. Aber Versionierung oder Timestamping sind möglicherweise angebracht, wenn Sie engere Einschränkungen haben. Ein anderer Ansatz besteht darin, so viel wie möglich von Ihrer Antwort innerhalb der Grenzen der Transaktion zu bilden, so dass ein OOME dazu führen würde, dass die Transaktion abgebrochen wird. Und möglicherweise können persistente Nachrichtenwarteschlangen, die Transaktionsanforderungen und -ergebnisse enthalten, das sein, was Sie wollen (sehen Sie sich ActiveMQ von Apache an). +1 für die Sondierungsfragen! –

4

HTTP hat keinen solchen Statuscode, aber es gibt eine Best Practice, mit der Sie solche Situationen behandeln können - den Benutzer nach einem POST-Vorgang umleiten.Hier

ist ein Bruch nach unten -

  1. Eine POST-Anforderung versucht, Daten auf dem Server
  2. zu ändern, wenn der Server ausfällt, ist es ein 500-Fehler sendet Ausfall
  3. , um anzuzeigen, wenn der Server erfolgreich ist, sendet er eine 302-Umleitung Antwort
  4. der Browser sendet dann einen neuen GET-Request an den Server
  5. Wenn dies nicht gelingt, können Sie einen 500-Fehler erhalten, sonst hat man ein 200
  6. erhalten

Also, Ihr Anwendungsfall von ‚Gespeicherte Daten aber kann es nicht sofort abrufen‘ entspricht eine 302-Umleitung für die erste POST von einem 500 für die nachfolgenden GET gefolgt.

Dieser Ansatz hat noch weitere Vorteile - Sie, das lästige loszuwerden ‚Sind Sie sicher, dass Sie die Daten erneut senden möchten?‘ Botschaft. Außerdem werden die Schaltflächen zum Zurück/Vorwärts/Aktualisieren verwendet.