2008-11-12 6 views
11

Wir haben eine REST-API, an die Clients routinemäßig POST- und PUT-Daten senden. Wenn sie dies tun, senden sie manchmal Daten, was zu keiner Veränderung auf unserem System führt. Die POSTs und PUTs sind wohlgeformt, aber die Daten, die sie senden, sind identisch mit den Daten in unserer Datenbank. Wenn dies passiert, habe ich gerade herausgefunden, dass wir einen 400 HTTP-Status zurückgeben. Leider bedeutet dies "schlechte Anfrage" wie in "Anfrage konnte der Server wegen missgebildeter Syntax nicht verstanden werden".REST: Korrekter HTTP-Antwortcode für einen POST, der ignoriert wird

Offensichtlich ist dies nicht der Fall, aber mir wurde gesagt, dass wir dies verwenden werden, da es keinen anderen geeigneten Statuscode gibt. Entscheidungen, die wir in Betracht gezogen haben:

  • 304 Nicht geändert. Dies ist leider nur für GET-Anfragen.
  • 204 Kein Inhalt. Scheint nahe, verbietet aber einen Körper.

Andere Möglichkeiten scheinen gleichermaßen schlecht. Wir gehen vielleicht mit 200 OK und haben die relevanten Informationen in dem XML-Dokument, das wir zurückgeben, aber das scheint nicht sehr "RESTish". Wie geht es der REST-Welt generell?

(Fixed Not Modified-Response-Code. Dank Mkoeller)

+0

HTTP-Status 302 heißt "Gefunden". – mkoeller

Antwort

17

Ich denke, es ist vollkommen in Ordnung, eine 200 OK in diesem Fall, die Daten wurden korrekt verarbeitet und der Server hat, was es musste. Da der Server die Daten ordnungsgemäß verarbeitet hat, sollte er einen OK-Statuscode zurückgeben. Die Tatsache, dass es intern ignoriert wurde, ist oder sollte irrelevant sein.

Was der Server mit den Daten gemacht hat, sollte den Clients nicht mitgeteilt werden, ihnen sollte gesagt werden, was mit der Anfrage passiert ist (ok, Fehler aufgetreten und ähnliches).

Und wenn, aus irgendeinem seltsamen Grund (ich kann nicht denken, eine gültige, BTW), ist es von Interesse für die Kunden, Sie haben die Antwort, um ihnen zu sagen.

1

Von Client den Server-Status anzuzeigen ist das gleiche, wenn der Anforderungsinhalt ist das gleiche auf dem Server oder nicht, nicht wahr? Da der Server im Nachhinein genau den Inhalt enthält, der gesendet wurde, warum sollte der Server mit irgendeinem Fehlerstatus antworten? Warum sollte der Client dagegen stören, wenn der Inhalt der Anfrage der gleiche ist wie der Server schon? Es wurde erfolgreich auf den Server übertragen, so dass der Großteil der Arbeit erledigt ist. Wie soll ein Client reagieren, wenn für diese Situation ein anderer Antwortcode vorhanden ist?

Fazit: Ihre Situation eines Anforderungsinhaltes gleich dem vorhandenen Inhalt ist kein Spezialfall. Sie sollten mit demselben Antwortstatuscode antworten. Das könnte 200, 302 oder 303 sein.

2

Wenn die Clients das Entity-Tag für den Inhalt auf dem Server vor dem PUT kennen können, dann gibt es die If-Match-Header und die 412 Precondition Failed-Antwort für genau die Situation, die Sie beschreiben.

+0

Sie meinen 'If-None-Match' –