400 Bad Request теперь может показаться лучшим кодом состояния HTTP / 1.1 для вашего варианта использования.
Во время вашего вопроса (и моего первоначального ответа) RFC 7231 не был чем-то особенным; в этот момент я возразил, 400 Bad Request
потому что RFC 2616 сказал (с акцентом мой):
Сервер не может понять запрос из-за неправильного синтаксиса .
и запрос, который вы описываете, является синтаксически допустимым JSON, заключенным в синтаксически допустимый HTTP, и, следовательно, у сервера нет проблем с синтаксисом запроса.
Однако, как отметил Ли Саферит в комментариях , RFC 7231, который устарел RFC 2616, не включает это ограничение :
Код состояния 400 (неверный запрос) указывает на то, что сервер не может или не будет обрабатывать запрос из-за чего-то, что воспринимается как ошибка клиента (например, синтаксис искаженного запроса, кадрирование неверного сообщения запроса или обманчивая маршрутизация запроса).
Однако до этой переписки (или если вы хотите поспорить о том, что RFC 7231 является только предлагаемым стандартом прямо сейчас), 422 Unprocessable Entity
не кажется неправильным код состояния HTTP для вашего варианта использования, потому что во введении к RFC 4918 говорится:
Хотя коды состояния, предоставляемые HTTP / 1.1, достаточны для описания большинства состояний ошибок, с которыми сталкиваются методы WebDAV, есть некоторые ошибки, которые не попадают аккуратно в существующие категории. Эта спецификация определяет дополнительные коды состояния, разработанные для методов WebDAV (Раздел 11)
И описание422
говорит:
Код состояния 422 (Unprocessable Entity) означает, что сервер понимает тип содержимого объекта запроса (следовательно, код состояния 415 (Unsupported Media Type) является неподходящим), и синтаксис объекта запроса является правильным (таким образом, 400 (неверный запрос) ) код состояния не подходит), но не удалось обработать содержащиеся в нем инструкции.
(Обратите внимание на ссылку на синтаксис; я подозреваю, что 7231 частично устарел и 4918)
Это звучит точно так же, как ваша ситуация, но на случай, если возникли какие-либо сомнения, он говорит:
Например, это условие ошибки может возникнуть, если тело запроса XML содержит правильно сформированные (то есть синтаксически правильные), но семантически ошибочные инструкции XML.
(Замените «XML» на «JSON», и я думаю, что мы можем согласиться, что это ваша ситуация)
Теперь некоторые будут возражать, что RFC 4918 относится к «HTTP-расширениям для Web-распределенной авторизации и управления версиями (WebDAV)» и что вы (предположительно) ничего не делаете с WebDAV, поэтому не должны использовать его.
Учитывая выбор между использованием кода ошибки в исходном стандарте, который явно не охватывает ситуацию, и кодом из расширения, которое точно описывает ситуацию, я бы выбрал последний.
Кроме того, в разделе 21.4 RFC 4918 содержится ссылка на реестр кодов состояния протокола IANA для передачи гипертекста (HTTP) , где можно найти 422.
Я предполагаю, что для клиента или сервера HTTP вполне разумно использовать любой код состояния из этого реестра, если они делают это правильно.
Но с HTTP / 1.1 у RFC 7231 есть тяга, так что просто используйте 400 Bad Request
!