2012-05-24 3 views
20

Так что я занимаюсь разработкой API RestHttp Код состояния 400 против 412

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

400 - Bad Request

ИЛИ

412 - Precondition Failed

и почему?

ответ

28

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

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

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

+1

Он также заявляет, что запрос не может быть выполнен из-за искаженного синтаксиса для 400. – Rob

+1

Эта страница действительно помогла мне - http://odino.org/don-t-rape-http-if-none-match-the- 412-http-status-code/- Использование запросов «PUT» для контекста облегчило мне понять, для чего это необходимо, так как всегда легко злоупотреблять определенными кодами состояния. – Charlie

12

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

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

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

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

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

+0

Почему downvote? Что случилось с ответом? – nunespascal

+4

Подумайте, что у кого-то был плохой день. Просто проигнорируйте это и дайте системе выполнить свою работу :) – BalusC

+0

Имейте upvote, чтобы сбалансировать это. –

3

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

Смежные вопросы