Я создаю RESTful API, который будет обрабатывать ряд взаимодействий с пользователем, включая размещение заказов с использованием сохраненных кредитных карт.
В случае успешного заказа я возвращаю 200 OK, а в случае, если запрос заказа неправильный или недействительный, я возвращаю 400 Bad Request. Но что мне вернуть, если возникла проблема во время фактического оформления заказа?
- Заказ POSTS клиента на сервер для пользовательского ресурса. Если пользователь не существует, возвращается 404 Not Found.
- Формат заказа и информация проверены. Если неверно, возвращается 400 Bad Request.
- Заказ обработан. Если заказ успешен, для заказа возвращается 201 Created. Если обнаружена непредвиденная ошибка, возвращается ошибка сервера 500.
Последний шаг - проблема - что мне вернуть, если заказ не выполнен по какой-либо другой причине? Возможные сценарии могут включать:
- Товар распродан
- Достигнут максимальный лимит заказа пользователя
- Сбой транзакции по кредитной карте (недостаточно средств и т. Д.)
Это не кажется подходящим ни для 400, ни для 500. Во всяком случае, я мог бы видеть это как 400, если нет лучшего кода - запрос был недействительным в соответствии с бизнес-правилами. Это просто не кажется точным.
Изменить: также нашел это существующее обсуждение той же темы. Все ответы там, похоже, указывают на использование кодов состояния для этого типа нарушения, с некоторыми обсуждениями использования расширения 400, 409 или 422.
источник
Ответы:
Вы должны использовать 400 для бизнес-правил. Не возвращайте 2xx, если заказ не был принят. HTTP - это протокол приложения, никогда не забывайте об этом. Если вы вернете 2xx, клиент может предположить, что заказ был принят, независимо от любой информации, которую вы отправляете в теле.
Из Поваренной книги веб-служб RESTful :
Я оставлю вам выбор между 4xx и 5xx, но вы должны использовать код состояния ошибки.
источник
Вы должны использовать 4xx для ошибки клиента, если клиент может изменить запрос, чтобы обойти ошибку. Используйте 5xx для ошибки сервера, которую клиент не может исправить.
Распроданный товар был бы ошибкой сервера. Клиент не может каким-либо образом изменить запрос, чтобы обойти ошибку. Вы могли бы переключиться на другой продукт, но разве это не новый запрос?
Достижение максимального лимита заказа пользователя также является ошибкой сервера. Клиент ничего не может сделать, чтобы обойти эту ошибку.
Сбой транзакции по кредитной карте будет ошибкой клиента. Клиент может повторно отправить запрос с другим способом оплаты или номером кредитной карты, чтобы обойти ошибку.
источник
Тип ошибки:
Код ошибки:
Сервер понимает тип содержимого объекта запроса (следовательно, код состояния 415 Unsupported Media Type не подходит), и синтаксис объекта запроса правильный (таким образом, код состояния 400 Bad Request не подходит), но не смог обработать содержащиеся инструкции.
Например, это состояние ошибки может возникнуть, если тело запроса XML содержит правильно сформированные (т. Е. Синтаксически правильные), но семантически ошибочные инструкции XML.
https://httpstatuses.com/422
источник
Я знаю, что это старый вопрос, но сегодня я задал тот же вопрос. Если у моего пользователя заканчиваются кредиты, какой код статуса должен вернуть мой REST API?
Я склоняюсь к
402 Payment Required
:Согласно Википедии :
И действительно , они делают :
источник
Как насчет
424 Failed Dependency
? Спецификация описывает это как:Но есть еще такое определение :
Вы можете сообщить клиенту (или сделать вид), что у вас есть внутренние действия, которые должны создать заказ и вычесть баланс, и что одно из этих действий не удалось, хотя и по вполне уважительным причинам, и именно поэтому запрос не удался.
Насколько я понимаю, «действие» - довольно широкий термин, и его можно использовать в самых разных ситуациях, включая недостаточный запас, недостаточный кредит или ночь на складе.
Другой вариант
422 Unprocessable Entity
:Попытка запросить товар, которого нет в наличии, или когда у вас недостаточно средств на счете, может считаться ошибкой на семантическом уровне.
MozDev говорит, что это указывает на ошибку на стороне клиента, а именно: клиент не должен повторять этот запрос без изменений.
Loopback 4 использует 422, когда проверка ввода не выполняется.
Возможно, недостаточный запас или вечеринка на складе можно рассматривать как временное состояние, поэтому запрос можно будет повторить позже. На эту ситуацию может указывать
503 Service Unavailable
источник
Я не думаю, что 400 можно использовать для всех бизнес-сценариев. Его можно использовать для проверки ввода основных данных. Кроме того, нам, возможно, будет сложно вовремя уместить другую бизнес-логику в этот код ошибки. Ошибки, обрабатываемые этим, в основном являются ошибками времени разработки, с которыми разработчик может столкнуться во время кодирования клиента.
Допустим, все параметры верны, и допустим, мы передаем в запрос номер учетной записи пользователя.
Таким образом, запрос больше не является плохим запросом, сервер может принять запрос. Но теперь он отказывается выполнить запрос на основании новой доступной информации, а именно - на счете недостаточно средств.
Я бы посоветовал нам использовать 403 с соответствующим сообщением об ошибке в этих сценариях.
Другим возможным кодом ошибки может быть конфликт 409. Но это используется в сценариях, когда ресурс находится в согласованном состоянии.
источник
Я использую 406
Not Acceptable
.Вот список 4xx:
источник