18

Ich habe eine Ressource wie diese sales/customers/{customerno}. Wenn ein Client eine PUT-Anforderung an diese Ressource sendet, würde ich 400 - Ungültige Anforderung zurückgeben, wenn das XML im Entitätshauptteil kein gültiges XML ist. Was aber, wenn das XML gültig ist, aber der Inhalt des XML nicht gültig ist. Nehmen wir zum Beispiel an, dass der Client versucht, den PostCode des Kunden zu aktualisieren, und einen PostCode bereitstellt, der nicht gültig ist. Ist es richtig, 400 - Schlechte Anfrage in diesem Fall zurückzugeben, oder ist es ein anderer http-Code, den ich hätte verwenden sollen?REST - Wenn 400 zu verwenden ist ("Bad Request")

Antwort

24

Von Wikipedia's List of HTTP Status Codes:

400 Bad Request: Die Anforderung kann nicht wegen schlechter Syntax erfüllt werden.

In diesem Fall gesendet Sie Ihren Kunden eine XML-Nutzlast, die eine ungültige Postleitzahl hatte, die eine Form der ungültigen Syntax ist; Daher ist das Senden einer fehlerhaften 400-Anforderung ein geeigneter Fehlercode, der in dieser Situation zurückgegeben wird.

Darüber hinaus zitiert Wikipedia RFC-4918 als Ressource zu diesem Thema. Aus diesem Dokument finden Sie die folgenden Informationen:

Server können fragwürdige Anfragen ablehnen, zum Beispiel mit einem 400 (Bad Request) Statuscode (obwohl sie von wohlgeformten XML bestehen) und eine optionale Antwortstelle, die das Problem erklärt.

Da Ihre Anfrage wohlgeformt ist (die XML ist nicht schlecht, es enthält nur semantisch falsche Informationen) Sie kann ablehnen, den Inhalt mit dem Statuscode 400. Das Wort *may* legt nahe, dass es andere Möglichkeiten gibt.

Während Sie versucht sein könnten, den Statuscode 422 zu verwenden, wäre dies in dieser Situation nicht korrekt, da die ungültige Postleitzahl die Kriterien nicht als semantischer Fehler erfüllt. Lesen Sie weiter unten ...

Aus Wikipedia:

422 Unprocessable Entity (WebDAV, RFC 4918): Der Antrag wohlgeformt wurde, aber konnte nicht befolgt werden, aufgrund semantische Fehler.

Darüber hinaus sind hier einige definitions to assist in the interpretation of status code 422:

  • Syntaxfehler bei der Analyse des Eingangscodes auftreten und werden durch grammatisch falsche Aussagen verursacht. Typische Fehler können ein unzulässiges Zeichen in der Eingabe, ein fehlender Operator, zwei Operatoren in einer Zeile, zwei Anweisungen in derselben Zeile ohne dazwischenliegendes Semikolon, unsymmetrische Klammern, ein falsch platziertes reserviertes Wort usw. sein.

    Semantische Fehler auftreten während der Ausführung des Codes, nachdem er als grammatikalisch korrekt analysiert wurde. Diese haben nicht damit zu tun, wie Aussagen konstruiert werden, sondern mit was sie gemeint sind. Dinge wie falsche Variablentypen oder -größen, nicht vorhandene Variablen, Subskripte außerhalb des Bereichs und dergleichen sind semantische Fehler.

Ihre ungültige Postleitzahl ist weder ein Syntaxfehler noch ein semantischer Fehler; Daher ist es sinnvoll, den Statuscode 422 als Option auszuschließen.

Um Ihre Frage zu beantworten, ist Statuscode 400 geeignet; Sie können jedoch auch andere Optionen haben.

+0

Und die anderen Optionen sind? –

+2

Ich fand das nützlich, aber ich bin etwas verwirrt von der Schlussfolgerung. Ich verstehe, dass es eine computerwissenschaftliche Definition von "semantisch" gibt, die sich von ihrer allgemeinen Verwendung unterscheidet. Außerhalb der Informatik könnte eine ungültige Postleitzahl in diesem Zusammenhang als semantischer Fehler bezeichnet werden. Ich vermute, dass Sie Recht haben, dass der RFC es spezifisch im Sinne der Informatik bedeutete, aber wie nützlich könnte ein solcher Fehler jemals sein? Wie könnte es überhaupt ein * client * -Fehler sein? – Semicolon

+0

@Semicolon - Mein Verständnis ist, dass, wenn der XML-Code wohlgeformt wäre, aber die Postleitzahl außerhalb des Bereichs liege, dies die Definition im letzten Aufzählungspunkt erfüllen würde. In den USA wäre 123456 beispielsweise eine schlechte Postleitzahl, aber XML wäre nicht ungültig. Ein Fehler, der besagt, dass "400 Falsche Anfrage - Bitte geben Sie eine gültige Postleitzahl ein" könnte hilfreich sein, wenn sie an den Kunden zurückgesendet wird. Hoffe das hilft. – jmort253

17

Die überarbeitete Version der HTTP-Spezifikation here hat den Wortlaut aktualisiert, um zu vermeiden, dass diese Verwirrung über 400 auf fehlerhafte Anfragen beschränkt wird.

7.4.1. 400 Ungültige Anforderung

Der Server kann die Anforderung aufgrund eines Fehlers des Clients nicht verarbeiten oder verarbeiten (z. B. fehlerhafte Syntax).

+0

Enthält 400-Code auch IDs in der Payload, deren Benutzer der Ressourcenbesitzer nicht ist? – Elisabeth

+0

@Elisabeth Nicht sicher, dass ich Ihr Szenario vollständig verstehe, aber ich denke, die Antwort ist ja. –

+0

Das Szenario ist eine Nutzlast mit einigen Fremdschlüssel-IDs, die einem anderen Benutzer gehören. Das Löschen dieser IDs auf dem Server würde Ressourcen eines anderen Benutzers löschen. Das wäre wirklich schlimm. – Elisabeth

Verwandte Themen