HTTP-Statuscode für eine teilweise erfolgreiche Anforderung

115

Ich habe eine Anwendung, die Nachrichten an Benutzer sendet. In einer Post-Anfrage wird eine XML-Zeichenfolge übertragen, die aus allen Benutzern besteht, die diese bestimmte Nachricht erhalten sollen. Wenn einer der Benutzer in der Liste nicht vorhanden ist, gebe ich die Liste der vermissten Benutzer zur weiteren Auswertung an den Client zurück.

Jetzt frage ich mich, was der richtige Statuscode für die Anwendung wäre, der besagt, dass die Anfrage angenommen wurde, aber es gab Dinge, die nicht getan werden konnten.

Das Problem würde vermieden, wenn fehlende Benutzer nicht in die Liste aufgenommen würden. Dann würde der Sendeversuch nur einen 4xx-Fehler erhalten. Es macht jedoch keinen Sinn, die API auf diese Weise zu erstellen. Andererseits könnte ich die Fehlerbedingung als rein anwendungsspezifisch betrachten. Aber eine 200 zu senden fühlt sich einfach nicht richtig an. Und es wäre schön, dem Kunden einen Hinweis zu geben, wann er tief in die Fehlerantwort schauen soll. zB um zu vermeiden, dass Nachrichten immer wieder an diese Benutzer gesendet werden

Norbert Hartl
quelle

Antworten:

66

Ich habe mich mit einem sehr ähnlichen Thema befasst. In diesem Fall habe ich a zurückgegeben

207 Multi-Status

Dies ist kein striktes HTTP, sondern Teil der WebDAV-Erweiterung. Wenn Sie also nicht auch die Kontrolle über den Client haben, ist dies nicht gut für Sie. Wenn Sie dies tun, könnten Sie so etwas tun:

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

Aber auch dies ist eine HTTP-Erweiterung, und Sie müssen auch die Kontrolle über den Client haben.

Kylar
quelle
3
Ich dachte darüber nach, aber ich fühlte mich nicht ganz wohl damit. Vielen Dank!
Norbert Hartl
Das Schöne daran ist, dass Sie so viele oder nur wenige relevante Daten zurückgeben können, wie Sie möchten. Dies ist besonders nützlich für gemischte Datensätze, dh wenn einige fehlschlagen und andere erfolgreich sind.
Kylar
Ich verstehe. Ich versuche nur, ein zusätzliches Maß an Statusbehandlung zu vermeiden (was meiner Meinung nach nicht schön ist). Der größte Teil meines Codes funktioniert mit HTTP. Und ich denke, mein beschriebener Anwendungsfall wird ohne gut auskommen.
Norbert Hartl
Sie können jederzeit einen Text zurücksenden - senden Sie einen 200 mit einer JSON-Antwort oder was auch immer Sie möchten, um festzustellen, welche erfolgreich waren.
Kylar
Ja, ich weiß. Aber wenn Sie einen Körper zurückgeben, müssen Sie ihn analysieren. In diesem Moment führen Sie eine zweite Ebene der Anwendungslogik ein. Dies erhöht die Komplexität und Sie brauchen einen guten Grund, dies zu tun.
Norbert Hartl
65

Ich hatte das gleiche Problem und habe am Ende zwei verschiedene Lösungen verwendet:

  • HTTP-Rückkehrcode 202: Accepted, der angibt, dass die Anfrage in Ordnung war, aber es gibt keine Garantie dafür, dass tatsächlich alles so lief, wie es sollte.
  • Geben Sie 200in der Antwort einen Normalwert zurück, fügen Sie jedoch eine Liste der Elemente hinzu, die nicht im Antworttext enthalten sind.

Der zweite funktioniert normalerweise am besten, aber der erste ist großartig, wenn Sie faul sind oder eine Warteschlange für die Verarbeitung verwenden.

Arne
quelle
5
Bezieht sich 202 nicht eher auf Warteschlangen?
Sinaesthetic
6
Ja, @Sinaesthetic. Aus der neuesten HTTP 1.1-Spezifikation "(...) wurde die Anforderung zur Verarbeitung angenommen, aber die Verarbeitung wurde nicht abgeschlossen". Für einen teilweisen Erfolg ist 202 also nicht geeignet.
Huercio
-4

Was ist mit der Verwendung von 206 Teilinhalten? Ich weiß, bei 206 geht es mehr um Bereiche, aber was ist, wenn dies auf eine teilweise erfolgreiche Anforderung hinweisen könnte?

Yusuf
quelle
MDN lautet wie folgt: "Der Antwortcode für den Erfolgsstatus des HTTP 206-Teilinhalts zeigt an, dass die Anforderung erfolgreich war und der Textkörper die angeforderten Datenbereiche enthält, wie im Bereichskopf der Anforderung beschrieben." Soweit ich weiß, ist 206 Teilinhalt ausschließlich für Anfragen mit einem Inhaltsbereich bestimmt.
sbbs
-14

Das HyperText-Übertragungsprotokoll befasst sich mit der Übertragungsseite der Dinge. Es gibt keine Fehlercodes für Fehler auf Anwendungsebene.

Die Rückgabe von 200 ist hier das Richtige. In Bezug auf HTTP wurde die Anfrage ordnungsgemäß empfangen, ordnungsgemäß verarbeitet und Sie senden die Antwort zurück. Auf HTTP-Ebene ist also alles in Ordnung. Alle Fehler oder Warnungen in Bezug auf die Anwendung, die über http ausgeführt wird, sollten in der Antwort enthalten sein. Auf diese Weise werden auch einige unangenehme Probleme vermieden, die bei Proxyservern auftreten können, bei denen bestimmte Antworten möglicherweise nicht wie erwartet verarbeitet werden.

AVee
quelle
18
HTTP ist ein Protokoll auf Anwendungsebene. Sie können es nicht einfach auf Transport- und Anwendungsebene setzen. Wenn Sie an OSI denken, befindet sich HTTP auf den Ebenen 5-7. HTTP ist etwas anders. Die meisten Header und Rückkehrcodes sind tatsächlich anwendungsspezifisch. Die Codes hängen nur von den Informationen ab, die in den HTTP-Protokolleinheiten angegeben sind, und nicht von benutzerdefinierten Anwendungsformaten. In Bezug auf die 200 würde ich sagen, dass Ihre Definition rein falsch ist, wenn sie auf Verben angewendet wird, die nicht POST sind. Aber POST verändert das Spiel ein wenig und in diesem Zusammenhang ist Ihre Annahme, dass "richtig gehandhabt" wird, auch nicht sicher
Norbert Hartl
Genau genommen betrachtet OSI HTTP als Protokoll auf Anwendungsebene, und wenn mit einem "normalen" Webserver gesprochen wird, ist dies der Fall. In Ihrem Fall führen Sie jedoch Ihr eigenes Protokoll über HTTP aus, wie dies heutzutage bei vielen Anwendungen der Fall ist. Bei dieser Art der Nutzung stellt HTTP nur den Transport bereit. (Ihre Anwendung sendet Nachrichten an Benutzer, überträgt keinen Hypertext ...)
AVee
2
Nur um das klar zu stellen. HTTP auf REST-Weise ist ressourcenzentriert. In diesem Zusammenhang bedeutet 200 Identität (die von Ihnen angegebene Ressource) anstelle von 3xx, die in Richtung der Identität zeigt. Durch die Verwendung von POST wird der Ressourcen-URI in einen Verarbeitungs-URI umgewandelt, und die Fehlercodes müssen damit umgehen. Der Kontext verschiebt sich ein wenig und die Definition der Dinge wird ein bisschen verschwommen oder zumindest schwer zu verstehen
Norbert Hartl
1
Die Kontextverschiebung bedeutet auch, dass es keine geeigneten Fehlercodes gibt, da das Protokoll nie unter Berücksichtigung dieses Kontexts entworfen wurde ;-) Ich denke auch, dass Sie mit der Verwendung von Fehlercodes vorsichtig sein sollten, da Proxyserver dazu neigen, mit ihnen zu arbeiten und Ihre Antwort durch a zu ersetzen Benutzerdefinierte Fehlerseite, dies kann eine echte PITA sein.
AVee
1
Trotzdem danke für die Beantwortung meiner Frage. Ich habe gerade festgestellt, dass Stackoverflow ein schlechter Chat-Client ist :)
Norbert Hartl