Дополнительно
Коды состояния REST HTTP для неудачной проверки или недействительного дубликата
Я создаю приложение с API на основе REST и дошел до того, что определяю коды состояния для каждого запроса.
Какой код состояния я должен отправлять для запросов, не прошедших проверку или когда запрос пытается добавить дубликат в мою базу данных?
Я просмотрел http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html, но ни один из них не кажется мне подходящим.
Существует ли общая практика отправки кодов состояния?
778
8
Для ошибки проверки ввода: 400 Bad Request + ваше дополнительное описание. Это предложено в книге "RESTful Web Services". Для двойной отправки: 409 Conflict.
Обновление июня 2014 года
Соответствующей спецификацией раньше была RFC2616, в которой использование 400 (Bad Request) описывалось довольно узко, как
Таким образом, можно было бы утверждать, что он не подходит для семантических ошибок. Но не более; с июня 2014 года соответствующий стандарт RFC 7231, который заменяет предыдущий RFC2616, дает использование 400 (Bad Request) в более широком смысле как
Вам обязательно следует дать более подробное объяснение в заголовках и/или теле ответа (например, с помощью пользовательского заголовка -
X-Status-Reason: Validation failed
).Я рекомендую код состояния 422, "Unprocessable Entity".
200,300, 400, 500 все очень обобщенное. Если вы хотите универсальный, 400-это нормально.
422 используется большее количество API и используется даже рельсы из коробки.
Независимо от того, какой код состояния вы выбираете для вашего API, кто-то не согласится. Но я предпочитаю 422, потому что я думаю, что '400 + текст статуса' как слишком общее. Также, вы'т воспользовавшись помощью JSON-парсер готов, в отличие от 422 с JSON ответ, это очень явные, и большое количество информации об ошибках могут быть переданы.
Говоря о JSON ответ, я склоняюсь к стандартизации на рельсы ответ об ошибке для этого дела, а именно:
Этот формат идеально подходит для проверки форме, которую считаю наиболее сложный случай для поддержки в плане 'отчетов об ошибках богатство'. Если ваша структура ошибка это, он, вероятно, обрабатывать все ваши ошибки отчетности.
Дубликат в базе данных должна быть
409 конфликт
.Я рекомендую использовать
422 UNPROCESSABLE лица
для ошибок валидации.Я даю больше объяснений кодов 4хх здесь: http://parker0phil.com/2014/10/16/REST_http_4xx_status_codes_syntax_and_sematics/
200
Тьфу... (309, 400, 403, 409, 415, 422)... много ответов, пытаясь угадать, спорить и стандартизации, что является лучшим возврата код для успешного запроса HTTP но не вызов REST.
Это неправильно смешать кодов состояния HTTP и остальные коды состояния.
Однако, я видел много реализаций смешивая их, и многие разработчики могут со мной не согласиться.
Коды возврата протокола HTTP касаются самого
HTTP-запроса
. Вызов REST осуществляется с использованием протокола передачи гипертекста запрос и он работает на более низком уровне, чем сама вызывается метод отдыха. Остальное-это концепция/подход, а его выход-это бизнес/логические результат, в то время как код результата HTTP-это транспорт один.К примеру, вернувшись на "404 не найдена" Когда вы звоните /пользователи/ это смущает, потому что это может означать:
на "403 запрещено Доступ запрещен" и может означать:
И этот список могут продолжить '500 ошибка сервера" и (для Apache/Nginx в ошибку HTTP или бизнес-ограничений, ошибки в остальных) или другие ошибки HTTP и т. д...
Из кода, это's жесткий, чтобы понять, что было причиной неисправности, а по HTTP (транспорт) отказ или отдыхать (логично) отказ.
Если HTTP-запроса физически был успешно выполнен он должен всегда возвращает 200 код, независимо от того, является запись(с) нашли или нет. Потому что Ури ресурс нашли и обрабатывается HTTP-сервер. Да, он может возвращать пустой набор. Можно ли получить пустой веб-страницы с 200 как результата http, верно?
Вместо этого вы можете вернуть 200 HTTP-код с некоторых вариантов:
Кроме того, некоторые интернет-провайдеры могут перехватить ваши запросы и возвращает HTTP-код 404. Это вовсе не означает, что ваши данные не найдены, но это's что-то неправильно на уровне транспорта.
С Wiki:
Почему бы просто не ответить что-то вроде этого?
Google всегда возвращает 200 код состояния в их геокодирования API, то даже если запрос логически завершается: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
Facebook всегда возвращают 200 для успешного HTTP-запросы, даже если запрос остальное терпит неудачу: https://developers.facebook.com/docs/graph-api/using-graph-api/error-handling
Это's простое, коды состояния HTTP для HTTP-запросов. API-интерфейс REST ваша, определение кодов состояния.
Эмбер-данных'адаптер S и ActiveRecord ожидает
422 UNPROCESSABLE Entity
в должен быть возвращен с сервера. Так что, если вы'заново клиент написал в Ember.js вы должны использовать 422. Только тогда ДС.Ошибки будут заполняться ошибки. Вы, конечно, можете изменить 422 любой другой код в ваш адаптер.Код состояния 304 не изменено также приемлемый ответ на повторяющийся запрос. Это похоже на обработку заголовка
если-нет-матч
через тег объекта.На мой взгляд, @Piskvor'ы ответ является более очевидным выбором, чтобы то, что я вижу, является намерением оригинальный вопрос, но у меня есть альтернатива, которая также актуальна.
Если вы хотите лечить повторяющийся запрос в виде предупреждения или уведомления, а не как ошибка, а ответ код состояния
304
не изменяется и расположение содержимого заголовок выявления существующих ресурсов будет так же действителен. Когда намерение состоит лишь в том, что существует ресурс, дубликат запрос будет не ошибка, а подтверждение. Запрос не является неправильным, но является просто излишним, и клиент может обратиться к существующему ресурсу.Другими словами, запрос-это хорошо, но, поскольку ресурс уже существует, то сервер не нужен для выполнения какой-либо дальнейшей обработки.