Какой соответствующий код состояния HTTP возвращается службой REST API при сбое проверки?

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

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

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

9 ответов

Решение

Если "ошибка проверки" означает, что в запросе есть какая-то ошибка клиента, используйте 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.

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

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

а также:

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

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

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

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

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

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

Вот:

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 неправильно используется для проверки объекта

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

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

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

Вот еще один интересный сценарий для обсуждения.

Что, если это API определения типа, который, например, принимает в качестве входных данных ссылку на некоторый локально сохраненный файл паркета, и после чтения некоторых метаданных блоков, составляющих файл, может понять, что один или несколько размеров блоков превышают настроенный порог и поэтому сервер решил, что файл неправильно разбит на разделы, и отказывается запускать процесс определения типа. Эта проверка предназначена для защиты от одного из двух (или обоих) сценариев: (1) длительное время обработки, плохой пользовательский опыт; (2) Серверное приложение взрывается с OutOfMemoryError

Какой ответ будет уместным в этом случае?

? - вроде работает, в общем.

? - несвязанный.

? - некоторые утверждают, что в данном случае это может быть уместно -

? - во многих старых ответах это упоминается как подходящий вариант для ошибки проверки ввода. Что меня беспокоит в его использовании в моем случае, так это определение этого кода ответа, в котором говорится, что это «из-за семантической ошибки», в то время как я не мог полностью понять, что означает семантическая ошибка в этом контексте, и можем ли мы рассматривать этот сбой действительно как семантическую ошибку отказ.

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

? Просматривая различные коды, я натыкаюсь на тот, который может подойти в моем случае, тот, о котором до сих пор никто не упоминал здесь, то есть я также задаюсь вопросом, может ли он быть подходящим или нет, поскольку это не фактическая полезная нагрузка, отправленная в слишком большой запрос, но полезная нагрузка ресурса хранится на сервере.

Это наводит меня на мысль, что, возможно, ответ 5xx здесь более уместен.

? Если мы скажем, что «память» похожа на «память», и если мы также скажем, что здесь мы быстро терпят неудачу, утверждая, что у нас недостаточно памяти (или мы можем выйти из строя из-за нехватки памяти) для обработки этого работа, то может быть может мне подойдёт. но не совсем.

Мой вывод состоит в том, что в сценарии такого типа, когда сервер отказывается вызывать действие над ресурсом из-за ограничений, связанных с пространством и временем, наиболее подходящим ответом будет 413 PayloadTooLarge

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

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

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

Если это так, я бы сказал, что "400 плохих запросов", вероятно, правильно, но не зная, что именно вы "проверяете", невозможно сказать.

если вы проверяете данные, а данные нет, в соответствии с определенными правилами лучше отправить 422(Unprocessable Entity), чтобы отправитель понял, что он нарушает правила, о которых договорились.

Плохой запрос для синтаксических ошибок. некоторые инструменты, такие как postman, заранее показывают синтаксические ошибки.

Другие вопросы по тегам