Ich habe eine JSON-Anfrage, die ich an eine HTTP-URL sende.
Sollte dies so behandelt werden, als 400
ob ein requestedResource
Feld vorhanden wäre, aber "Roman"
ein ungültiger Wert für dieses Feld ist?
[{requestedResource:"Roman"}]
Sollte dies so behandelt werden, als 400
ob ein "blah"
Feld überhaupt nicht existiert?
[{blah:"Roman"}]
Roman
, müssen sie Ihnen nur mehr bezahlen :)Antworten:
Ein 400 bedeutet, dass die Anforderung fehlerhaft war. Mit anderen Worten, der vom Client an den Server gesendete Datenstrom entsprach nicht den Regeln.
Im Fall einer REST-API mit einer JSON-Nutzlast werden normalerweise 400 verwendet, und ich würde zu Recht sagen, dass der JSON gemäß der API-Spezifikation für den Dienst in irgendeiner Weise ungültig ist.
Nach dieser Logik sollten beide von Ihnen bereitgestellten Szenarien 400 sein.
Stellen Sie sich stattdessen vor, dies wäre eher XML als JSON. In beiden Fällen würde das XML niemals die Schemaüberprüfung bestehen - entweder aufgrund eines undefinierten Elements oder eines falschen Elementwerts. Das wäre eine schlechte Anfrage. Gleiches Angebot hier.
quelle
Von w3.org
quelle
Die Auswahl eines HTTP-Antwortcodes ist eine recht einfache Aufgabe und kann durch einfache Regeln beschrieben werden. Der einzige schwierige Teil, der oft vergessen wird, ist Absatz 6.5 aus RFC 7231:
Die Regeln lauten wie folgt:
In Ihrem Fall habe ich also 400 Fehler zurückgegeben und so etwas, wenn "Roman" aus Benutzereingaben erhalten wird und der Client eine bestimmte Reaktion haben muss:
oder ein allgemeinerer Fehler, wenn eine solche Situation ein fehlerhafter Logikfehler in einem Client ist und nicht erwartet wird, es sei denn, der Entwickler hat etwas falsch gemacht:
quelle
In keinem Fall ist die "Syntax fehlerhaft". Es ist die Semantik, die falsch ist. Daher ist meiner Meinung nach eine 400 unangemessen. Stattdessen wäre es angebracht, eine 200 zusammen mit einer Art Fehlerobjekt wie
{ "error": { "message": "Unknown request keyword" } }
oder was auch immer zurückzugeben.Betrachten Sie die Client-Verarbeitungspfade. Ein Fehler in der Syntax (z. B. ungültiger JSON) ist ein Fehler in der Logik des Programms, dh ein Fehler, und sollte entsprechend behandelt werden, ähnlich wie beispielsweise bei einem 403; Mit anderen Worten, etwas Schlimmes ist schiefgegangen.
Ein Fehler in einem Parameterwert ist andererseits ein Fehler der Semantik, möglicherweise aufgrund einer schlecht validierten Benutzereingabe. Es ist kein HTTP-Fehler (obwohl es vermutlich ein 422 sein könnte). Der Verarbeitungspfad wäre anders.
In jQuery würde ich es beispielsweise vorziehen, keinen einzigen Fehlerbehandler schreiben zu müssen, der sich sowohl mit 500 als auch mit einem app-spezifischen semantischen Fehler befasst. Andere Frameworks, zum Beispiel Ember, behandeln HTTP-Fehler wie 400er und 500er ebenfalls als große Fettfehler, sodass der Programmierer erkennen muss, was vor sich geht, und verzweigen muss, je nachdem, ob es sich um einen "echten" Fehler handelt oder nicht.
quelle
Die Verwendung von
400
Statuscodes für einen anderen Zweck als die Angabe, dass die Anforderung fehlerhaft ist, ist einfach falsch.Wenn die Anforderungsnutzlast eine Bytefolge enthält, die nicht analysiert werden konnte
application/json
(wenn der Server dieses Datenformat erwartet), lautet der entsprechende Statuscode415
:Wenn die Anforderungsnutzlast syntaktisch korrekt, aber semantisch falsch ist, kann der nicht standardmäßige
422
Antwortcode oder der Standardstatuscode403
verwendet werden:quelle
image/gif
anstelletext/json
derContent-Type:
Kopfzeile. - Vermutlich gilt dies auch, wenn für eine Komponente eines Multiparts der falsche Typ angegeben ist. Weitere Informationen finden Sie unter tools.ietf.org/html/rfc4918.Denken Sie an Erwartungen.
Als Client-App erwarten Sie, dass Sie wissen, ob auf der Serverseite etwas schief geht. Wenn der Server einen Fehler auslösen muss, wenn er
blah
fehlt oder derrequestedResource
Wert falsch ist, ist ein Fehler von 400 angemessen.quelle
Als Ergänzung für diejenigen, die möglicherweise das gleiche Problem wie ich haben, verwende ich,
$.ajax
um Formulardaten auf dem Server zu veröffentlichen, und ich habe auch die400
Fehler erhalten.Angenommen, ich habe eine Javascript-Variable.
Verwenden Sie die Variable nicht
formData
direkt als Schlüsselwertdata
wie folgt:Verwenden Sie stattdessen JSON.stringify, um Folgendes zu kapseln
formData
:Wie andere bereits gezeigt haben, liegt der Fehler darin, dass der Server die Anfrage aufgrund einer fehlerhaften Syntax nicht erkennen konnte. Ich habe gerade eine Instanz in der Praxis ausgelöst. Hoffe es wäre hilfreich für jemanden.
quelle
Überprüfen Sie zuerst die URL, die möglicherweise falsch ist. Wenn sie korrekt ist, überprüfen Sie dann den Anforderungshauptteil, den Sie senden. Die mögliche Ursache ist, dass die von Ihnen gesendete Anforderung die richtige Syntax fehlt.
Überprüfen Sie zum Ausarbeiten die Anforderungszeichenfolge auf Sonderzeichen. Wenn es (Sonderzeichen) verwendet wird, ist dies die Hauptursache für diesen Fehler.
Versuchen Sie, die Anforderung zu kopieren, und analysieren Sie alle Tag-Daten.
quelle