Код ответа 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, которые не предоставляются непосредственно пользователю.


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

2
@vikarjramun Я построил фиктивный ОТДЫХ и сделал автономный. (предварительный выпуск) сейчас наши студенты ищут, пытаясь создать действительные запросы данных, но это все чайник. Я "начальник" - но это тоже работает.
LenglBoy

2
Этот RFC тупой. Вы можете приготовить кофе в чайнике, если вы наливаете его через ситечко в чашку. Точно так же, как использование чая из листьев. Вы также можете приготовить чай в кафе без проблем.
Гбертон

2
@gburton Это требует вмешательства человека, хотя. По сети вам определенно нужно устройство с поддержкой кофе для приготовления кофе. Конечно, кофе и чайник не должны отвечать 418.
Джаспер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.