Какой соответствующий код состояния HTTP возвращается службой REST API при сбое проверки? - PullRequest
347 голосов
/ 25 декабря 2009

В настоящее время я возвращаю 401 Несанкционированный каждый раз, когда сталкиваюсь с ошибкой проверки в моем приложении REST API на основе Django / Piston . Посмотрев на Реестр кодов состояния HTTP Я не уверен, что это подходящий код для ошибки проверки, что вы порекомендуете?

  • 400 Плохой запрос
  • 401 Несанкционированный
  • 403 Запрещено
  • 405 Метод не разрешен
  • 406 Недопустимо
  • 412 Не выполнено предварительное условие
  • 417 Ожидание не удалось
  • 422 Необработанный объект
  • 424 Неудачная зависимость

Обновление : «Ошибка проверки», указанная выше, означает ошибку проверки данных на уровне приложения, т. Е. Неправильно указанную дату и время, фиктивный адрес электронной почты и т. Д.

Ответы [ 7 ]

265 голосов
/ 25 декабря 2009

Если «ошибка проверки» означает, что в запросе есть какая-то ошибка клиента, используйте HTTP 400 (неверный запрос). Например, если предполагается, что URI имеет дату ISO-8601, и вы обнаружите, что она имеет неправильный формат или относится к 31 февраля, тогда вы вернете HTTP 400. То же самое, если вы ожидаете правильно сформированный XML в теле объекта и не удается разобрать.

(1/2016): За последние пять лет Более специфичный HTTP 422 (Unprocessable Entity) WebDAV стал очень разумной альтернативой HTTP 400. Смотрите, например, его использование в JSON API . Но учтите, что в HTTP 422 не превращено в HTTP 1.1, RFC-7231 .

Richardson и Ruby RESTful Web Services содержит очень полезное приложение о том, когда использовать различные коды ответов HTTP. Они говорят:

400 («Неверный запрос»)
Важность: высокая.
Это общее состояние ошибки на стороне клиента, используемое, когда другой код ошибки 4xx не подходит. Обычно используется, когда клиент представляет представление вместе с PUT или POST запрос, и представление в правильном формате, но оно не делает любое чувство. (стр. 381)

и

401 («Несанкционированный»)
Важность: высокая.
Клиент пытался работать с защищенным ресурсом, не предоставив надлежащие учетные данные для аутентификации. Возможно, он предоставил неверные учетные данные или не указал их вообще. Учетные данные могут быть именем пользователя и паролем, ключом API или аутентификацией маркер - что бы ни ожидала рассматриваемая служба. Обычно клиент делает запросите URI и примите 401, чтобы он знал, какие учетные данные отправлять и в каком формате. [...]

81 голосов
/ 25 августа 2014

Из RFC 4918 (а также документально подтверждено на http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml):

Код состояния 422 (Unprocessable Entity) означает, что сервер понимает тип содержимого объекта запроса (отсюда Недопустимый код состояния 415 (неподдерживаемый тип носителя) и синтаксис объекта запроса является правильным (таким образом, 400 (неправильный запрос) код статуса не подходит), но не удалось обработать содержимое инструкции. Например, это условие ошибки может возникнуть, если XML Тело запроса содержит правильно сформированный (т.е. синтаксически правильный), но семантически ошибочные инструкции XML.

23 голосов
/ 17 октября 2014

Дубликат в базе данных должен быть 409 CONFLICT.

Я рекомендую использовать 422 UNPROCESSABLE ENTITY для ошибок проверки.

Я приведу более подробное объяснение кодов 4xx здесь: http://parker0phil.com/2014/10/16/REST_http_4xx_status_codes_syntax_and_sematics/

14 голосов
/ 04 декабря 2015

Вот оно:

rfc2616 # section-10.4.1 - 400 неверных запросов

Запрос не может быть понят сервером с ошибкой Синтаксис . Клиент НЕ ДОЛЖЕН повторять запрос без изменений.

rfc7231 # section-6.5.1 - 6.5.1. 400 Неверный запрос

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

Относится к уродливым (не хорошо сформированным) случаям!

rfc4918 - 11.2. 422 необработанного объекта

Код состояния 422 (Unprocessable Entity) означает, что сервер
понимает тип содержимого объекта запроса (следовательно, код состояния 415 (неподдерживаемый тип носителя) не подходит), а синтаксис объекта запроса является правильным (таким образом, код состояния 400 (неправильный запрос) не подходит ), но не смог обработать содержащиеся в нем инструкции. Например, это условие ошибки может возникнуть, если тело XML-запроса содержит правильно сформированные (то есть синтаксически правильные), но семантически ошибочные , инструкции XML.

Заключение

Эмпирическое правило: [_] 00 охватывает наиболее общие случаи и случаи, которые не охватываются указанным кодом.

422 соответствует наилучшей ошибке проверки объекта (именно моя рекомендация:)
Что касается семантически ошибочного - Подумайте о чем-то вроде проверки «Это имя пользователя уже существует».

400 неправильно используется для проверки объекта

8 голосов
/ 25 декабря 2009

Технически, я бы сказал, что это может быть не HTTP-сбой, поскольку ресурс (предположительно) был указан правильно, пользователь прошел аутентификацию, и не было никакого операционного сбоя (однако даже в спецификации есть некоторые зарезервированные коды, такие как 402 Payment Required) которые строго не связаны с HTTP, хотя было бы целесообразно иметь это на уровне протокола, чтобы любое устройство могло распознать условие).

Если это действительно так, я бы добавил поле статуса к ответу с ошибками приложения, например

4 Недопустимый диапазон дат

1 голос
/ 25 декабря 2009

Немного больше информации о семантике этих ошибок содержится в RFC 2616 , который документирует HTTP 1.1.

Лично я, вероятно, использовал бы 400 Bad Request, но это только мое личное мнение без какой-либо фактической поддержки.

0 голосов
/ 25 декабря 2009

Что именно вы подразумеваете под "неудачей проверки"? Что вы проверяете? Вы имеете в виду что-то вроде синтаксической ошибки (например, неправильно сформированный XML)?

Если это так, я бы сказал, что 400 Bad Request, вероятно, правильная вещь, но, не зная, что именно вы «проверяете», невозможно сказать.

...