400 Bad Request scheint nun der beste HTTP/1.1-Statuscode für Ihren Anwendungsfall zu sein.
Zur Zeit Ihrer Frage (und meiner ursprünglichen Antwort) war RFC 7231 noch nicht vorhanden; zu diesem Zeitpunkt widersprach ich 400 Bad Request
, weil RFC 2616 sagte (mit meiner Hervorhebung):
Der Server konnte die Anforderung aufgrund einer fehlerhaften Syntax nicht verstehen.
und die von Ihnen beschriebene Anforderung ist syntaktisch gültiges JSON in syntaktisch gültigem HTTP, und daher hat der Server keine Probleme mit der Syntax der Anforderung.
Jedoch wurde darauf hingewiesen von Lee Saferite in den Kommentaren, dass RFC 7231, das RFC 2616 obsolet macht, diese Einschränkung nicht enthält:
Der Statuscode 400 (Bad Request) gibt an, dass der Server die Anforderung aufgrund eines als Clientfehler wahrgenommenen Problems nicht verarbeiten kann oder wird (z. B. fehlerhafte Anforderungssyntax, ungültiges Anforderungsnachrichten-Design oder irreführende Anforderungsweiterleitung).
Allerdings, vor dieser Neufassung (oder wenn Sie über RFC 7231 nur als einen derzeit nur vorgeschlagenen Standard streiten möchten), scheint 422 Unprocessable Entity
kein falscher HTTP-Statuscode für Ihren Anwendungsfall zu sein, denn wie die Einleitung zu RFC 4918 sagt:
Während die von HTTP/1.1 bereitgestellten Statuscodes in der Lage sind, die meisten Fehlerbedingungen zu beschreiben, die bei WebDAV-Methoden auftreten, gibt es einige Fehler, die nicht sauber in die vorhandenen Kategorien fallen. Diese Spezifikation definiert zusätzliche Statuscodes, die für WebDAV-Methoden entwickelt wurden (Abschnitt 11)
Und die Beschreibung von 422
besagt:
Der Statuscode 422 (Unprocessable Entity) bedeutet, dass der Server den Inhaltstyp der Anforderungseinheit versteht (daher ist ein 415 (Unsupported Media Type) Statuscode unangemessen) und die Syntax der Anforderungseinheit korrekt ist (daher ist ein 400 (Bad Request) Statuscode unangemessen), aber nicht in der Lage war, die enthaltenen Anweisungen zu verarbeiten.
(Beachten Sie den Verweis auf Syntax; Ich vermute, dass 7231 auch 4918 teilweise obsolet macht)
Dies klingt genau wie Ihre Situation, aber nur für den Fall, dass Zweifel bestehen, fährt es fort zu sagen:
Zum Beispiel kann dieser Fehler auftreten, wenn ein XML-Anforderungskörper wohlgeformte (d. h. syntaktisch korrekte), aber semantisch fehlerhafte XML-Anweisungen enthält.
(Ersetzen Sie "XML" durch "JSON" und ich denke, wir können zustimmen, dass dies Ihre Situation ist)
Jetzt werden einige einwenden, dass RFC 4918 sich mit "HTTP-Erweiterungen für Web-Autorensysteme und Versionierung (WebDAV)" befasst und Sie (vermutlich) nichts mit WebDAV zu tun haben und daher keine Dinge daraus verwenden sollten.
Bei der Wahl zwischen der Verwendung eines Fehlercodes im Originalstandard, der die Situation ausdrücklich nicht abdeckt, und einem aus einer Erweiterung, der die Situation genau beschreibt, würde ich letzteres wählen.
Darüber hinaus verweist RFC 4918 Abschnitt 21.4 auf das IANA-Hypertext-Transfer-Protokoll (HTTP)-Statuscode-Verzeichnis, wo 422 zu finden ist.
Ich schlage vor, dass es absolut vernünftig ist, dass ein HTTP-Client oder Server einen Statuscode aus diesem Verzeichnis verwendet, solange dies korrekt erfolgt.
Aber seit HTTP/1.1 hat RFC 7231 Rückenwind, also verwenden Sie einfach 400 Bad Request
!