400 Yêu cầu Không hợp lệ dường như là mã trạng thái HTTP / 1.1 tốt nhất cho trường hợp sử dụng của bạn.
Tại thời điểm câu hỏi của bạn (và câu trả lời ban đầu của tôi), RFC 7231 không phải là một điều; tại thời điểm đó tôi đã phản đối 400 Bad Request
vì RFC 2616 đã nói (với sự nhấn mạnh của tôi):
Máy chủ không thể hiểu được yêu cầu do cú pháp không đúng .
và yêu cầu bạn mô tả là JSON hợp lệ về mặt cú pháp được bao bọc trong HTTP có hiệu lực về mặt cú pháp và do đó máy chủ không có vấn đề gì với cú pháp của yêu cầu.
Tuy nhiên, như Lee Saferite đã chỉ ra trong các bình luận , RFC 7231, đã lỗi thời RFC 2616, không bao gồm hạn chế đó :
Mã trạng thái 400 (Yêu cầu xấu) chỉ ra rằng máy chủ không thể hoặc sẽ không xử lý yêu cầu do lỗi được coi là lỗi máy khách (ví dụ: cú pháp yêu cầu không đúng định dạng, đóng khung thông báo yêu cầu không hợp lệ hoặc định tuyến yêu cầu lừa đảo).
Tuy nhiên, trước khi diễn đạt lại (hoặc nếu bạn muốn ngụy biện về RFC 7231 chỉ là một tiêu chuẩn được đề xuất ngay bây giờ), 422 Unprocessable Entity
dường như không phải là mã trạng thái HTTP không chính xác cho trường hợp sử dụng của bạn, bởi vì như giới thiệu về RFC 4918 nói:
Mặc dù các mã trạng thái được cung cấp bởi HTTP / 1.1 là đủ để mô tả hầu hết các điều kiện lỗi mà các phương thức WebDAV gặp phải, có một số lỗi không nằm gọn trong các danh mục hiện có. Đặc tả này xác định các mã trạng thái bổ sung được phát triển cho các phương thức WebDAV (Phần 11)
Và mô tả về422
nói:
Mã trạng thái 422 (Thực thể không thể xử lý) có nghĩa là máy chủ hiểu loại nội dung của thực thể yêu cầu (do đó mã trạng thái 415 (Loại phương tiện không được hỗ trợ) là không phù hợp) và cú pháp của thực thể yêu cầu là chính xác (do đó là 400 (Yêu cầu sai ) mã trạng thái không phù hợp) nhưng không thể xử lý các hướng dẫn có trong đó.
(Lưu ý tham chiếu đến cú pháp; Tôi nghi ngờ 7231 cũng bị lỗi thời 4918)
Âm thanh này chính xác như tình hình của bạn, nhưng chỉ trong trường hợp có bất kỳ nghi ngờ gì nữa, nó tiếp tục nói:
Ví dụ, điều kiện lỗi này có thể xảy ra nếu một thân yêu cầu XML chứa các hướng dẫn XML được định dạng đúng (nghĩa là đúng về mặt cú pháp), nhưng sai về mặt ngữ nghĩa, về mặt ngữ nghĩa.
(Thay thế "XML" bằng "JSON" và tôi nghĩ chúng ta có thể đồng ý rằng đó là tình huống của bạn)
Bây giờ, một số người sẽ phản đối rằng RFC 4918 nói về "Phần mở rộng HTTP cho Tác giả và Phiên bản phân tán Web (WebDAV)" và bạn (có lẽ) không làm gì liên quan đến WebDAV vì vậy không nên sử dụng những thứ từ nó.
Đưa ra lựa chọn giữa việc sử dụng mã lỗi trong tiêu chuẩn ban đầu rõ ràng không bao gồm tình huống và một từ một phần mở rộng mô tả chính xác tình huống, tôi sẽ chọn cái sau.
Hơn nữa, RFC 4918 Mục 21.4 đề cập đến Sổ đăng ký mã trạng thái giao thức truyền siêu văn bản (HTTP) IANA , nơi có thể tìm thấy 422.
Tôi đề nghị rằng việc khách hàng hoặc máy chủ HTTP sử dụng bất kỳ mã trạng thái nào từ sổ đăng ký đó là hoàn toàn hợp lý, miễn là họ làm như vậy một cách chính xác.
Nhưng kể từ HTTP / 1.1, RFC 7231 có lực kéo, vì vậy chỉ cần sử dụng 400 Bad Request
!