Код ответа 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 - Не выполнено предварительное условие для условных запросов при использовании даты последнего изменения и ETag.

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

Единственный другой выбор, который возможен - это 422 - Необработанный объект.

Даррел Миллер
источник
10
хотя он часто используется в этом контексте, 403 не ограничивается контролем доступа, поскольку rfc2616-10.4.4 говорит: «Сервер понял запрос, но отказывается его выполнить. [...] если сервер желает сделать Публично, почему запрос не был выполнен, он ДОЛЖЕН описать причину отказа в организации ». Причиной могут быть неверные данные. Однако 422 здесь более применимо.
Янник Луазо
7
Давайте не будем увлекаться текстовой критикой. См., Например, trac.tools.ietf.org/wg/httpbis/trac/ticket/294, в котором делается попытка уточнить, что 403 всегда был и был посвящен авторизации.
fumanchu
2
@fumanchu Хороший улов. Ссылка на запрос на изменение, которому всего 7 часов :-)
Darrel Miller
1
@fumanchu Это означает, что 403 должен быть возвращен в случае, если у пользователя нет разрешения на доступ к запрашиваемому ресурсу. Но я думаю, что 401 Unauthorized больше подходит для доступа к ресурсу, на который у пользователя нет прав.
Амит Патель
1
401 Unauthorized предложит веб-браузеру показать пользователю стандартное HTTP-имя пользователя / пароль. Если вы не используете такой тип аутентификации для своей службы или если у пользователя уже есть HTTP-аутентификация, 401 не подходит.
Грег Болл
92

Я бы порекомендовал 422. Он не является частью основной спецификации HTTP, но он определяется общедоступным стандартом (WebDAV) и должен рассматриваться браузерами так же, как и любой другой код состояния 4xx.

Из RFC 4918 :

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

Майк Дек
источник
20
Обратите внимание, что в цитируемом тексте говорится, что 422 применим, когда объект запроса синтаксически правильно сформирован, но семантически ошибочен. Если объект запроса искажен, 400 является соответствующим ответом.
Мэтти К
87

Если запрос не может быть правильно проанализирован (включая объект / тело запроса), соответствующий ответ - 400 Bad Request [ 1 ].

RFC 4918 утверждает, что 422 Unprocessable Entity применима, когда объект запроса синтаксически правильно сформирован, но семантически ошибочен. Поэтому, если объект запроса искажен (например, неправильный формат электронной почты), используйте 400; но если это просто не имеет смысла (вроде @example.com), используйте 422.

Если проблема в том, что, как указано в вопросе, имя пользователя / адрес электронной почты уже существует, вы можете использовать 409 Conflict [ 2 ] с описанием конфликта и подсказкой о том, как его исправить (в данном случае, «выберите другое имя пользователя / адрес электронной почты "). Однако в спецификации, как написано, 403 Forbidden [ 3 ] также может использоваться в этом случае, несмотря на аргументы о HTTP-авторизации.

412 Precondition Failed [ 4 ] используется, когда заголовок запроса предварительного условия (например If-Match), который был предоставлен клиентом, оценивается как false. То есть клиент запросил что-то и предоставил предварительные условия, прекрасно зная, что эти предварительные условия могут потерпеть неудачу. 412 никогда не должны возникать на клиенте неожиданно и не должны быть связаны с объектом запроса как таковым .

Мэтти К
источник
1
Я должен отметить обновленные RFC HTTP / 1.1: 400 Bad Request, 409 Conflict, 403 Forbidden и т. Д. Live in tools.ietf.org/html/rfc7231 ; 412 Сбой предварительного
Мэтти К,
41

Забавно возвращаться 418 I'm a teapotк запросам, которые явно обработаны или являются вредоносными и «не могут произойти», например, неудачная проверка CSRF или отсутствующие свойства запроса.

2.3.2 418 Я чайник

Любая попытка заваривать кофе с чайником должна привести к коду ошибки «418 I'm a teapot». Получившееся тело сущности МОЖЕТ быть коротким и крепким.

Чтобы это было достаточно серьезным, я ограничиваю использование смешных кодов ошибок конечными точками RESTful, которые не предоставляются непосредственно пользователю.

doug65536
источник
11
Реализуйте его так, чтобы ваш API возвращался 418 I'm a teapotдля всех запросов от вашего босса :)
vikarjramun
2
@vikarjramun Я построил фиктивный ОТДЫХ и сделал автономный. (предварительный выпуск) сейчас наши студенты ищут, пытаясь создать действительные запросы данных, но это все чайник. Я "начальник" - но это тоже работает.
LenglBoy
2
Этот RFC тупой. Вы можете приготовить кофе в чайнике, если вы наливаете его через ситечко в чашку. Точно так же, как использование чая из листьев. Вы также можете приготовить чай в кафе без проблем.
Гбертон
2
@gburton Это требует вмешательства человека, хотя. По сети вам определенно нужно устройство с поддержкой кофе для приготовления кофе. Конечно, кофе и чайник не должны отвечать 418.
Джаспер