400 Błędne żądanie wydaje się teraz najlepszym kodem statusu HTTP / 1.1 dla twojego przypadku użycia.
W momencie twojego pytania (i mojej pierwotnej odpowiedzi) RFC 7231 nie było rzeczą; w którym momencie sprzeciwiłem się, 400 Bad Request
ponieważ RFC 2616 powiedział (z naciskiem mój):
Serwer nie mógł zrozumieć żądania z powodu nieprawidłowej składni .
a opisywane przez ciebie żądanie jest poprawnym składniowo JSON zamkniętym w poprawnym składniowo HTTP, a zatem serwer nie ma problemów ze składnią żądania.
Jednak, jak wskazał Lee Saferite w komentarzach , RFC 7231, która przestarza RFC 2616, nie obejmuje tego ograniczenia :
Kod statusu 400 (Błędne żądanie) wskazuje, że serwer nie może lub nie przetworzy żądania z powodu czegoś, co jest postrzegane jako błąd klienta (np. Źle sformułowana składnia żądania, nieprawidłowe sformułowanie komunikatu żądania lub oszukańczy routing żądania).
Jednak przed tym ponownym sformułowaniem (lub jeśli chcesz spierać się o to, że RFC 7231 jest obecnie tylko proponowanym standardem), 422 Unprocessable Entity
nie wydaje się nieprawidłowy kod statusu HTTP dla twojego przypadku użycia, ponieważ ponieważ mówi wprowadzenie do RFC 4918:
Chociaż kody stanu dostarczone przez HTTP / 1.1 są wystarczające do opisania większości warunków błędów napotykanych przez metody WebDAV, istnieją pewne błędy, które nie mieszczą się w odpowiednich kategoriach. Ta specyfikacja określa dodatkowe kody statusu opracowane dla metod WebDAV (sekcja 11)
I opis422
mówi:
Kod statusu 422 (Unprocessable Entity) oznacza, że serwer rozumie typ treści encji żądania (stąd kod statusu 415 (Unsupported Media Type) jest nieodpowiedni), a składnia encji żądania jest poprawna (a więc 400 (Bad Request ) kod stanu jest nieodpowiedni), ale nie mógł przetworzyć zawartych instrukcji.
(Zwróć uwagę na odniesienie do składni; podejrzewam, że 7231 częściowo przestarza również 4918)
To brzmi dokładnie tak , jak twoja sytuacja, ale na wypadek wątpliwości, mówi dalej:
Na przykład ten warunek błędu może wystąpić, jeśli treść żądania XML zawiera dobrze sformułowane (tj. Poprawne składniowo), ale semantycznie błędne instrukcje XML.
(Zamień „XML” na „JSON” i myślę, że możemy się zgodzić, że taka jest Twoja sytuacja)
Teraz niektórzy sprzeciwiają się temu, że RFC 4918 dotyczy „Rozszerzeń HTTP dla Web DistributedV Authoring and Versioning (WebDAV)” i że (prawdopodobnie) nie robisz nic związanego z WebDAV, więc nie powinieneś z tego korzystać.
Biorąc pod uwagę wybór między użyciem kodu błędu w oryginalnym standardzie, który wyraźnie nie obejmuje sytuacji, a jednym z rozszerzenia dokładnie opisującego sytuację, wybrałbym ten drugi.
Ponadto sekcja 21.4 RFC 4918 odnosi się do rejestru kodów statusu protokołu HTTP (IANA Hypertext Transfer Protocol) , w którym można znaleźć 422.
Proponuję, aby całkowicie uzasadnione było, aby klient lub serwer HTTP używał dowolnego kodu statusu z tego rejestru, o ile robi to poprawnie.
Ale od HTTP / 1.1 RFC 7231 ma przyczepność, więc po prostu użyj 400 Bad Request
!