REST код відповіді для недійсних даних


272

Який код відповіді повинен бути переданий клієнту у випадку наступних сценаріїв?

  1. Неправильні дані, передані під час реєстрації користувача, наприклад, неправильний формат електронної пошти
  2. Ім'я користувача / електронна пошта вже існує

Я вибрав 403. Я також виявив, що я вважаю, що його можна використовувати.

Вікіпедія:

412 Попередня умова не виконана: сервер не відповідає одній з передумов, які запитувач поставив у запиті

Запропонуйте код, якщо я повинен використовувати інший, ніж 403.


Можливий дублікат: stackoverflow.com/questions/3050518 / ...
Genjo

Я також вирішую це питання. Глава 7. Валідація специфікацій JAX-RS (2017) надає поради щодо коду статусу, спеціально для порушень обмежень. download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-spec/…
burntsugar

Відповіді:


298

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

412 - Попередня умова не виконана, використовується для умовних запитів при використанні останньої модифікованої дати та ETags.

403 - Заборонено використовується, коли сервер бажає запобігти доступ до ресурсу.

Єдиний інший вибір, який можливий, це 422 - Недоступна сутність.


10
хоча він часто використовується в цьому контексті, 403 не обмежується контролем доступу, оскільки rfc2616-10.4.4 говорить: "Сервер зрозумів запит, але відмовляється його виконувати. [...] якщо сервер бажає зробити громадськості, чому запит не виконано, він ДОЛЖЕН би описати причину відмови в суб’єкті господарювання ". Причиною можуть бути невірні дані. Однак 422 тут більше застосовано.
Яннік Луазо

7
Давайте не зациклюємось на текстовій критиці. Дивіться, наприклад, trac.tools.ietf.org/wg/httpbis/trac/ticket/294, який намагається уточнити, що 403 є і завжди стосувався авторизації.
фуманчу

2
@fumanchu Приємний улов. Посилання на запит на зміну, якому лише 7 годин :-)
Даррел Міллер

1
@fumanchu Це означає, що 403 має бути повернутий, якщо користувач не має дозволу на доступ до запитуваного ресурсу. Але я думаю, що 401 Несанкціонований є більш доцільним для доступу до ресурсу, на який користувач не має дозволу.
Аміт Патель

1
401 Несанкціонований запросить веб-браузер, щоб показати користувачеві стандартне запит ім'я користувача / пароль HTTP. Якщо ви не використовуєте такий тип аутентифікації для своєї послуги або якщо користувач уже має автентифікацію HTTP, 401 не підходить.
Грег Бал

92

Я б рекомендував 422. Це не частина основної специфікації HTTP, але вона визначається державним стандартом (WebDAV), і до неї слід обробляти браузери так само, як і будь-який інший код статусу 4xx.

Від RFC 4918 :

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


20
Зауважимо, що в тексті, що цитується, зазначено, що 422 застосовний тоді, коли суб'єкт запиту синтаксично добре сформований, але семантично помилковий. Якщо суб'єкт запиту є зібраним, 400 - відповідна відповідь.
Matty K

87

Якщо запит не вдалося правильно проаналізувати (включаючи суб'єкт / орган запиту), відповідна відповідь становить 400 поганих запитів [ 1 ].

RFC 4918 зазначає, що 422 об'єкт, що не обробляється , застосовний, коли запитуючий орган синтаксично добре сформований, але семантично помилковий. Тож якщо об'єкт запиту є зібраним (як неправильний формат електронної пошти), використовуйте 400; але якщо це просто не має сенсу (як @example.com), використовуйте 422.

Якщо проблема полягає в тому, що, як зазначено в запитанні, ім’я користувача / електронна адреса вже існує, ви можете використовувати 409 Conflict [ 2 ] з описом конфлікту та підказкою про те, як його виправити (у цьому випадку "виберіть інше ім’я користувача / електронна пошта "). Однак у специфікації, як написано, 403 Заборонено [ 3 ] також можна використовувати в цьому випадку аргументи про HTTP Авторизацію, незважаючи на це.

412 Попередня умова не виконана [ 4 ] використовується, коли заголовок запиту передумови (наприклад If-Match), який постачав клієнт, оцінюється як хибне. Тобто, клієнт щось просив і надав передумови, добре знаючи, що ці передумови можуть вийти з ладу. 412 ніколи не повинні бути виникли на клієнті блакиті, і не повинно бути пов'язане з об'єктом запиту на собі .


1
Слід зазначити, що оновлені HTTP / 1.1 RFC: 400 Bad Request, 409 Conflict, 403 Forbidden etc. live in tools.ietf.org/html/rfc7231 ; 412 Попередня умова є в tools.ietf.org/html/rfc7232#section-4.2
Matty K

41

Повертатися 418 I'm a teapotдо запитів, які очевидно створені або зловмисні і "не можуть статися", наприклад, як невдача перевірки CSRF або відсутність властивостей запиту, забавно .

2.3.2 418 Я чайник

Будь-яка спроба заварювання кави з чайником повинна спричинити код помилки "418 Я чайник". Отриманий орган суб'єкта МОЖЕ бути коротким та кремезним.

Щоб зробити його досить серйозним, я обмежую використання смішних кодів помилок на RESTful кінцевих точках, які безпосередньо не піддаються користувачеві.


11
Реалізуйте це так, щоб ваш API повертався 418 I'm a teapotдля всіх запитів, які надходять від вашого шефа :)
vikarjramun

2
@vikarjramun я створив манекен REST і зробив розсудливим один офлайн. (попередня версія) тепер наші студенти шукають, намагаючись створити дійсні запити даних, але це все чайник. Я "начальник" - але він теж працює.
LenglBoy

2
Цей RFC німий. Ви можете приготувати каву в чайному посуді до тих пір, поки не будете наливати її через ситечко для чаю в чашку. Так само, як використання чаю з листя. Ви також можете заварити чай у кафенері без проблем.
gburton

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