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


394

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

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

Оновлення : "Невдача перевірки" вище означає помилку перевірки даних на рівні програми, тобто неправильно вказаний час, неправдиву електронну адресу тощо.


2
Ознайомтеся з цією відповіддю: stackoverflow.com/a/2657624/221612
Kenny Meyer

3
FWIW, посилання Кенні пропонує код 422, а відповідь Джим тепер робить нижче . #TheMoreYouKnow #SavingYouAClick
ruffin

Я думаю, 401 більш зрозумілий.
вступ

Відповіді:


298

Якщо "помилка перевірки" означає, що в запиті є якась помилка клієнта, тоді використовуйте HTTP 400 (поганий запит). Наприклад, якщо URI повинен мати дату ISO-8601, і ви виявите, що він у неправильному форматі або посилається на 31 лютого, ви повернете HTTP 400. Дітто, якщо ви очікуєте, що добре сформований XML в тілі сутності та вона не може розібратися.

(1/2016): За останні п’ять років більш специфічний HTTP 422 для WebDAV (непереробний об'єкт) став дуже розумною альтернативою HTTP 400. Дивіться, наприклад, його використання в API JSON . Але зауважте, що HTTP 422 не перетворив його на HTTP 1.1, RFC-7231 .

Веб-сервіси RESTful Річардсона та Рубі містять дуже корисний додаток про те, коли використовувати різні коди відповідей HTTP. Вони кажуть:

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

і:

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


3
Але, ймовірно, якщо формат URI недійсний, 404 може бути більш підходящим.
март

11
Як зазначає @ReWrite, я також думаю, що 422 краще для помилок перевірки.
panteo

11
Я б сказав, що це неправильно. 400 Bad Request використовується, коли в запиті синтаксично щось не так. Я б сказав, що ReWrite вірно рекомендує 422, що стосується змісту запиту.
Штійн де Вітт

3
@Kenji так, 401 ("Несанкціонований"): "Можливо, вони надали неправильні облікові дані ..." означає неправильний користувач та / або пароль.
razzintown

4
@JimFerrans 400 помилок - це те, де синтаксис невірний. Помилки 401 конкретно, якщо я намагаюся отримати доступ до сторінки, до якої мені потрібно ввійти, і я взагалі не ввійшов. 422 помилки - це те, де синтаксис правильний, але сервер відмовляється від послуги. Неправильне ім'я користувача / пароль - це правильний синтаксис (не 400 помилок), і я не намагаюся отримати доступ до сторінки, на яку мені потрібно ввійти, оскільки я отримую доступ до самої сторінки входу (не 401 помилка). Помилка 401 повинна використовуватися для щось на зразок сторінки налаштувань, до якої може отримати доступ лише користувач
Zachary Weixelbaum,

98

З RFC 4918 (а також задокументовано на веб- сайті http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml ):

Код стану 422 (Unprocessable Entity) означає, що сервер розуміє тип вмісту об'єкта запиту (отже, код статусу 415 (непідтримуваний тип медіа) неприйнятний), і синтаксис об'єкта запиту є правильним (таким чином, 400 (поганий запит) ) код статусу невідповідний), але не вдалося обробити містяться інструкцій. Наприклад, ця умова помилки може виникнути, якщо орган запиту XML містить добре сформовані (тобто синтаксично правильні), але семантично помилкові інструкції XML.


6
Я рекомендував би 422 - Недоступний об'єкт для помилок перевірки понад 400 - Поганий запит
java_geek


19

Ось:

rfc2616 # section-10.4.1 - 400 Поганий запит

Сервер не міг зрозуміти запит через неправильний синтаксис . Клієнт НЕ повинен повторювати запит без змін.

rfc7231 # розділ-6.5.1 - 6.5.1. 400 Поганий запит

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

Відноситься до неправильних (не добре сформованих) випадків!

rfc4918 - 11.2. 422 Недоступна особа

Код стану 422 (Unprocessable Entity) означає, що сервер
розуміє тип вмісту об'єкта запиту (отже, код статусу 415 (непідтримуваний тип медіа) неприйнятний), і синтаксис об'єкта запиту є правильним (таким чином, 400 (поганий запит) ) код статусу невідповідний), але не вдалося обробити містяться інструкцій. Наприклад, ця умова помилки може виникнути, якщо орган запиту XML містить добре сформовані (тобто синтаксично правильні), але семантично помилкові інструкції XML.

Висновок

Правило: [_] 00 охоплює найзагальніший випадок та випадки, які не охоплені позначеним кодом.

422 відповідає найкращій помилці перевірки об'єкта (саме моя рекомендація :)
Щодо семантично помилкових - придумайте щось на зразок перевірки "Це ім'я користувача вже існує".

400 неправильно використовується для перевірки об'єктів


9

Я б сказав технічно, що це не може бути збій HTTP, оскільки ресурс (мабуть) був дійсно вказаний, користувач отримав автентифікацію, і не було оперативної помилки (однак, навіть у специфікацію є деякі зарезервовані коди, наприклад 402 Потрібна оплата, яка не є ' t строго кажучи, що стосується HTTP, хоча це може бути доцільним, щоб це було на рівні протоколу, щоб будь-який пристрій міг розпізнати умову).

Якщо це насправді так, я б додав поле статусу до відповіді з помилками програми, наприклад

<status><code>4</code> <message> Діапазон дат недійсний </message> </status>


1

Є трохи більше інформації про семантику цих помилок в RFC 2616 , який документує HTTP 1.1.

Особисто я б, мабуть, користувався 400 Bad Request, але це лише моя особиста думка без фактичної підтримки.


0

Що саме ви маєте на увазі під "провалом перевірки"? Що ти перевіряєш? Ви маєте на увазі щось подібне до синтаксичної помилки (наприклад, неправильно сформованого XML)?

Якщо це так, я б сказав, що 400 поганих запитів - це, мабуть, правильна річ, але, не знаючи, що це ви "перевіряєте", сказати це неможливо.


що робити, якщо ми намагаємось перевірити певну перевірку бізнесу чи правила.
Metalhead
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.