21 Stimmen

REST: Korrekter HTTP-Antwortcode für eine POST, die ignoriert wird

Wir haben eine REST-API, an die Kunden routinemäßig POST- und PUT-Daten senden. Wenn sie dies tun, POSTen sie manchmal Daten, die zu keiner Änderung in unserem System führen. Die POSTs und PUTs sind wohlgeformt, aber die Daten, die sie senden, sind identisch mit den Daten in unserer Datenbank. Wenn das passiert, habe ich gerade herausgefunden, dass wir einen 400 HTTP-Status zurückgeben. Leider bedeutet dies "fehlerhafte Anfrage" im Sinne von "Anfrage konnte vom Server aufgrund einer fehlerhaften Syntax nicht verstanden werden".

Das ist natürlich nicht der Fall, aber mir wurde gesagt, dass wir diesen Code verwenden werden, da es keinen anderen geeigneten Statuscode gibt. Wir haben verschiedene Möglichkeiten in Betracht gezogen:

  • 304 Nicht geändert. Dies gilt leider nur für GET-Anfragen.
  • 204 Nein Inhalt. Scheint nahe dran zu sein, verbietet aber einen Entitäts-Körper.

Andere Möglichkeiten scheinen ebenso schlecht zu sein. Wir könnten uns entscheiden für 200 OK und die entsprechenden Informationen im XML-Dokument, das wir zurückgeben, zu haben, aber das scheint nicht sehr "REST-gerecht" zu sein. Wie wird dies in der REST-Welt im Allgemeinen gehandhabt?

(Der Antwortcode Not Modified wurde behoben. Danke Mkoeller)

27voto

Vinko Vrsalovic Punkte 252104

Ich denke, es ist völlig in Ordnung, in diesem Fall ein 200 OK zurückzugeben, die Daten wurden korrekt verarbeitet und der Server hat getan, was er tun musste. Da der Server die Daten korrekt verarbeitet hat, sollte er einen OK-Statuscode zurückgeben. Die Tatsache, dass er sie intern ignoriert hat, ist oder sollte irrelevant sein.

Was der Server mit den Daten gemacht hat, sollte den Clients nicht mitgeteilt werden, sondern nur, was mit der Anfrage passiert ist (Verarbeitung ok, Fehler aufgetreten usw.).

Und wenn es aus irgendeinem seltsamen Grund (mir fällt übrigens kein stichhaltiger Grund ein) für die Kunden von Interesse ist, haben Sie die Möglichkeit, ihnen das mitzuteilen.

3voto

Justin Sheehy Punkte 1796

Wenn die Clients in der Lage sind, das Entity-Tag für den Inhalt auf dem Server zu kennen, bevor sie PUT verwenden, dann gibt es mit If-Match-Headern und der Antwort 412 Precondition Failed genau die Situation, die Sie beschreiben.

1voto

mkoeller Punkte 4389

Aus Sicht des Clients ist der Serverstatus derselbe, unabhängig davon, ob der Inhalt der Anfrage auf dem Server derselbe war oder nicht, richtig? Da der Server im Nachhinein genau den Inhalt hat, der gesendet wurde, warum sollte der Server mit irgendeinem Fehlerstatus antworten? Andererseits, warum sollte sich der Client die Mühe machen, wenn der Inhalt der Anfrage derselbe war, der dem Server bereits bekannt war? Er wurde erfolgreich an den Server übertragen, so dass der Großteil der Arbeit erledigt ist. Wie soll ein Client reagieren, wenn es für diese Situation einen anderen Antwortcode gibt?

Schlussfolgerung: Ihre Situation, dass der Inhalt einer Anfrage dem vorhandenen Inhalt entspricht, ist kein Sonderfall. Sie sollten mit demselben Antwortstatuscode antworten. Das kann 200, 302 oder 303 sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X