HTTPQUERY
Русский

422 Unprocessable Content

Применение

Ошибка 422 Unprocessable Content указывает, что сервер понимает запрос, но считает его содержимое семантически некорректным. Тип содержимого распознан (иначе была бы отправлена ошибка 415 Unsupported Media Type). Синтаксис также корректен (иначе уместнее была бы ошибка 400 Bad Request).

Ошибка такого рода возникает, когда запрос содержит в теле сообщения блок XML-инструкций, правильно сформированный и понятый сервером, но содержащий логические ошибки, которые приводят к ошибке на стороне сервера.

Примечание

Повтор запроса с кодом 422 без изменения тела запроса даёт ту же ошибку. Клиент должен сначала устранить проблему с проверкой данных. Возвращайте 422, когда Content-Type распознан и синтаксис корректен, но бизнес-правила или проверка полей отклоняют данные.

Влияние на SEO

Поисковые системы вроде Google не индексируют URL с кодом состояния ответа 422 Unprocessable Content, и, как следствие, URL, проиндексированные ранее и возвращающие этот код состояния HTTP, удаляются из результатов поиска.

Пример

Клиент с помощью XML-документа запрашивает запуск задачи №100. XML-документ распознан сервером и синтаксически корректен. У сервера нет записи о задаче с id=100, поэтому запрос не может быть обработан.

Запрос

POST /requests HTTP/1.1
Host: example.com
Content-Type: application/xml
Content-Length: 101

<?xml version="1.0" encoding="utf-8"?>
<request>
   <id>100</id>
   <action>start</action>
</request>

Ответ

HTTP/1.1 422 Unprocessable Content
Content-Type: text/html
Content-Length: 150

<html>
  <head>
    <title>Request Failed</title>
  </head>
  <body>
   <p>Task #100 is not recognized.</p>
  </body>
</html>

Как исправить

Сначала изучите тело ответа. Большинство API и фреймворков возвращают подробности об ошибках на уровне полей с объяснением, какое значение не прошло проверку и почему. Используйте эти сообщения, чтобы точно определить проблему.

Проверьте тело запроса на соответствие ожидаемой схеме перед отправкой. Типичные причины: отсутствие обязательных полей, неверные типы данных (строка там, где API ожидает число), некорректный формат адреса электронной почты или даты, дублирование уникальных значений и значения перечислений вне допустимого набора.

Убедитесь, что заголовок Content-Type соответствует формату тела. Отправка JSON с типом содержимого text/plain приводит к сбоям разбора на многих серверах.

В Laravel ошибка 422 обычно означает, что не выполнены правила проверки формы. Посмотрите объект errors в JSON-ответе, чтобы узнать имена не прошедших проверку полей и сообщения валидации. В Rails неудачные проверки модели при создании или обновлении по умолчанию возвращают 422. Подробности смотрите в model.errors.

Для REST API вроде GitHub или Shopify убедитесь, что полезная нагрузка запроса соответствует текущей версии API. Имена полей, обязательные параметры и допустимые значения меняются от версии к версии.

На стороне сервера возвращайте структурированные ответы об ошибках, перечисляющие каждое некорректное поле, отклонённое значение и ожидаемый формат. Общие сообщения вида «validation failed» вынуждают клиентов гадать.

Примеры кода

.NET

HttpStatusCode.UnprocessableEntity

Rust

http::StatusCode::UNPROCESSABLE_ENTITY

Rails

:unprocessable_entity

Go

http.StatusUnprocessableEntity

Symfony

Response::HTTP_UNPROCESSABLE_ENTITY

Python3.5+

http.HTTPStatus.UNPROCESSABLE_ENTITY

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_UNPROCESSABLE_CONTENT
// deprecated alias: SC_UNPROCESSABLE_ENTITY

Angular

@angular/common/http/HttpStatusCode.UnprocessableEntity