Код состояния HTTP 400 против 412

Итак, я разрабатываю Rest API

Когда выполняется POST для создания ресурса, а обязательное поле отсутствует, что я должен вернуть?

ошибка 400, неверный запрос

OR

412 - Предварительное условие не выполнено

И почему?


person adamclerk    schedule 24.05.2012    source источник
comment
Отвечает ли это на ваш вопрос? Когда уместно ответить HTTP 412 ошибка?   -  person Michael Freidgeim    schedule 20.09.2020


Ответы (3)


Используйте 400, если параметры запроса неверны. Используйте 412, если один из If-* запросов заголовков, например If-Match, If-Modified-Since и т. д. не правы.

Почему? Это именно то, что говорит RFC. См., например, этот отрывок из спецификации If-Match:

Если ни один из тегов сущностей не совпадает или если задано «*», а текущей сущности не существует, сервер НЕ ДОЛЖЕН выполнять запрошенный метод и ДОЛЖЕН возвращать ответ 412 (ошибка предварительного условия). Это поведение наиболее полезно, когда клиент хочет запретить методу обновления, такому как PUT, модифицировать ресурс, который изменился с момента его последнего извлечения клиентом.

person BalusC    schedule 24.05.2012
comment
В нем также говорится, что запрос не может быть выполнен из-за неправильного синтаксиса для 400. - person Rob; 24.05.2012
comment
Мне очень помогла эта страница - odino.org/ – Использование контекстных запросов PUT помогло мне понять, для чего они нужны, поскольку всегда легко злоупотребить определенными кодами состояния. - person Charlie; 15.09.2014

412 используется, когда ваш сервер не соответствует условию, указанному клиентом.

В вашем случае вы должны использовать 400. Это просто плохой запрос.

См. эту ссылку для некоторых объяснений заголовков предварительных условий.

Заголовок Etag — это, как правило, строка, представляющая наш ресурс в заголовках HTTP. Вы запрашиваете ресурс с помощью If-Match, который является предварительным условным заголовком HTTP. Он отправит 412, если он не соответствует отправленному вами коду.

If-None-Match сообщает серверу обработать весь ответ, только если Etag отличается от отправленного клиентом.

person nunespascal    schedule 24.05.2012
comment
Подумай, у кого-то был плохой день. Просто игнорируйте это и дайте системе сделать свою работу :) - person BalusC; 24.05.2012

Вы можете использовать код состояния 422. Если вы не хотите, 400 подойдет.

person Julian Reschke    schedule 21.03.2013