Я создаю приложение с API на основе REST и дошел до того, что я задаю коды состояния для каждого запроса.
Какой код состояния я должен отправить для запросов, не прошедших проверку, или когда запрос пытается добавить дубликат в мою базу данных?
Я просмотрел http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html, но ни один из них не кажется правильным.
Есть ли распространенная практика при отправке кодов состояния?
http
rest
http-status-codes
AlexN
источник
источник
Ответы:
Для ошибки проверки ввода: 400 Bad Request + ваше необязательное описание. Это предлагается в книге " RESTful Web Services ". Для двойной подачи: 409 конфликтов
Обновление июнь 2014
Соответствующей спецификацией был RFC2616 , который давал использование 400 (Bad Request) довольно узко
Таким образом, можно утверждать, что это неуместно для семантических ошибок. Но не больше; с июня 2014 года соответствующий стандарт RFC 7231 , который заменяет предыдущий RFC2616, дает более широкое использование 400 (Bad Request) как
источник
something perceived to be a client error
, что все примеры, приведенные в этом параграфе, являются нарушениями протокола HTTP, а не логическими ошибками: синтаксис, кадрирование, маршрутизация. Таким образом, я считаю, что спецификация HTTP не позволяет 400 для неудачной проверки на уровне приложения.Вы должны определенно дать более подробное объяснение в заголовках и / или теле ответа (например, с пользовательским заголовком -
X-Status-Reason: Validation failed
).источник
HTTP/1.0 403 Form validation errors
- самый чистый путь.Я рекомендую код состояния 422 «Необработанный объект» .
источник
200,300, 400, 500 очень общие. Если вы хотите универсальный, 400 в порядке.
422 используется все большим количеством API, и даже используется Rails из коробки.
Независимо от того, какой код статуса вы выбираете для своего API, кто-то не согласится. Но я предпочитаю 422, потому что считаю «400 + текстовый статус» слишком общим. Кроме того, вы не используете JSON-готовый парсер; Напротив, 422 с ответом JSON очень явный, и может быть передано много информации об ошибках.
Говоря об ответе JSON, я склонен стандартизировать ответ об ошибках Rails для этого случая, а именно:
Этот формат идеально подходит для проверки формы, которую я считаю наиболее сложным вариантом для поддержки с точки зрения «богатства отчетов об ошибках». Если ваша структура ошибок такова, она, вероятно, будет обрабатывать все ваши потребности в сообщениях об ошибках.
источник
arg1
он действителен иarg2
действителен, но комбинация двух с конкретными отправленными значениями недопустима.200
Тьфу ... (309, 400, 403, 409, 415, 422) ... множество ответов, пытающихся угадать, спорить и стандартизировать, какой код возврата является лучшим для успешного HTTP-запроса, но неудачного вызова REST .
Это неправильно смешивать HTTP коды статуса и коды состояния покоя.
Однако я видел много реализаций, смешивающих их, и многие разработчики могут не согласиться со мной.
Коды возврата HTTP связаны с
HTTP Request
самим собой. Вызов REST выполняется с использованием запроса протокола передачи гипертекста, и он работает на более низком уровне, чем сам вызванный метод REST. REST - это концепция / подход, а его вывод - бизнес / логический результат, а код результата HTTP - транспорт .Например, возвращение «404 Не найдено» при вызове / users / вызывает путаницу, поскольку это может означать:
«403 Запрещено / Доступ запрещен» может означать:
И этот список может продолжаться с «500 Server error» (ошибка в HTTP-запросе Apache / Nginx или ошибка бизнес-ограничения в REST) или другими ошибками HTTP и т. Д.
Из кода трудно понять, что было причиной сбоя, HTTP (транспортный) сбой или REST (логический) сбой.
Если HTTP-запрос физически выполнен успешно, он всегда должен возвращать 200 кодов, независимо от того, найдены записи или нет. Потому что ресурс URI найден и обработан сервером HTTP. Да, он может вернуть пустой набор. Можно ли получить пустую веб-страницу с 200 как результат HTTP, верно?
Вместо этого вы можете вернуть 200 HTTP-код с некоторыми опциями:
Кроме того, некоторые интернет-провайдеры могут перехватить ваши запросы и вернуть вам код HTTP 404. Это не означает, что ваши данные не найдены, но что-то не так на транспортном уровне.
Из вики :
Почему бы просто не ответить чем-то вроде этого?
Google всегда возвращает 200 в качестве кода состояния в своем API геокодирования, даже если запрос логически не выполняется: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
Facebook всегда возвращает 200 для успешных HTTP-запросов, даже если REST-запрос не выполняется: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling
Все просто, коды состояния HTTP предназначены для запросов HTTP. REST API - это Ваш, определите Ваши коды статуса.
источник
BadRequest()
имеет свою собственную модель возврата, которая будет отличаться от вашей обычной модели возврата. Это кошмар, чтобы разобрать. @KevinHooke, возвращать HTTP 200 для ошибки проверки REST - все равно что сказать: «Я получил ваше сообщение, ответ - нет, и вот почему». Возвращение HTTP 400 говорит: «Я не знаю, о чем ты говоришь».Дубликат в базе данных должен быть
409 CONFLICT
.Я рекомендую использовать
422 UNPROCESSABLE ENTITY
для проверки ошибок.Я дам более подробное объяснение кодов 4xx здесь .
источник
Код состояния 304 «Не изменен» также дает приемлемый ответ на дубликат запроса. Это похоже на обработку заголовка с
If-None-Match
использованием тега объекта.По моему мнению, ответ @ Piskvor - более очевидный выбор того, что, по моему мнению, является целью первоначального вопроса, но у меня есть альтернатива, которая также актуальна.
Если вы хотите обрабатывать повторный запрос как предупреждение или уведомление, а не как ошибку, код состояния ответа
304
Не изменен иContent-Location
заголовок, идентифицирующий существующий ресурс, будут такими же действительными. Когда целью является просто обеспечение того, что ресурс существует, повторный запрос будет не ошибкой, а подтверждением. Запрос не является неправильным, но просто избыточен, и клиент может ссылаться на существующий ресурс.Другими словами, запрос хорош, но поскольку ресурс уже существует, серверу не нужно выполнять какую-либо дальнейшую обработку.
источник
Ожидается, что адаптер ActiveRecord Ember-Data
422 UNPROCESSABLE ENTITY
будет возвращен с сервера. Итак, если ваш клиент написан на Ember.js, вы должны использовать 422. Только тогда DS.Errors будет заполнен возвращенными ошибками. Конечно, вы можете изменить 422 на любой другой код в вашем адаптере.источник
406 - неприемлемо
Это означает, что этот ответ отправляется, когда веб-сервер после согласования содержимого на основе сервера не находит никакого содержимого, которое соответствует критериям, заданным пользовательским агентом.
источник