REST API и код состояния HTTP

У меня есть куча операций PUT, которые выполняют действия над входным ресурсом. Давайте рассмотрим пример: у меня есть платежная операция в моем API, в которой указано, что с кредитной карты должна быть снята определенная сумма. В моем коде я сначала проверяю, достаточно ли средств на карте, а затем выполняю операцию. Если суммы недостаточно, я просто возвращаю 400, но я не уверен, что это правильно.

Какой правильный код состояния HTTP в подобных случаях?

Я могу, конечно, отправить ответ с HTTP 200 и прикрепить полезную нагрузку с дополнительными подробностями, объясняющими ошибку. Я также могу вернуть HTTP 400 Bad Request или, что еще лучше, HTTP 412 Precondition Failed.

Какой правильный код для отправки в ответ в подобном сценарии, когда проверка не удалась? Есть ли какой-либо ресурс, который я могу прочитать, чтобы понять обоснование кодов состояния HTTP и глаголов HTTP?


person Lorenzo    schedule 26.03.2015    source источник


Ответы (3)


Используйте 422 необрабатываемый объект.

Код состояния 422 означает, что сервер понимает тип содержимого объекта запроса (поэтому код состояния 415 Unsupported Media Type является недопустимым), и синтаксис объекта запроса является правильным (таким образом, код состояния 400 Bad Request является недопустимым), но был не может обработать содержащиеся инструкции.

В противном случае просто используйте 400 для любой ошибки, связанной с вашим бизнес-доменом. По состоянию на июнь 2004 г. описание ошибки 400 было изменено следующим образом:

Сервер не может или не будет обрабатывать запрос из-за чего-то, что воспринимается как ошибка клиента.

person Robert Harvey    schedule 26.03.2015
comment
Спасибо за Ваш ответ. Однако, хотя ваш ответ имеет для меня смысл, я не могу просто найти соответствующее значение перечисления в перечислении System.Net.HttpStatusCode. На самом деле это число прыгает с 417 на 426. Это правильно? - person Lorenzo; 26.03.2015
comment
Более важно предоставить осмысленную полезную нагрузку (и задокументировать, что происходит при возникновении ошибки), чем использовать правильный код ошибки HTTP. См. также stackoverflow.com/a/3290198/102937, в котором говорится, что описание ошибки 400 изменилось с июня 2004 г., что делает его более подходящим для вашего состояния ошибки. - person Robert Harvey; 26.03.2015

Если операция не удалась из-за данных, отправленных пользователем (похоже, это так), вы должны использовать коды состояния 400 (общий) или 422 (более точный, но исходящий из спецификации WebDAV). Вы можете вернуть дополнительные подсказки об ошибке в полезной нагрузке (структура на ваше усмотрение), например:

{
    error: {
       "field": "amount",
       "message": "The amount isn't correct - Sufficient credit."
    }
}

Я думаю, что код 412 здесь не применяется, так как он должен быть возвращен, когда ваш сервер не соответствует условию, указанному клиентом (см. заголовки If-*, такие как If-Match, If-Modified-Since, ...).

Надеюсь, это поможет вам, Тьерри.

person Thierry Templier    schedule 26.03.2015

ИМО: я бы остановился на 200, а затем разобрал бы ответ и разобрался с этим. Коды состояния HTTP — это код состояния протокола, а не то, что следует использовать для работы с логикой приложения.

{
    "error": {
       "field": "amount",
       "message": "The amount isn't correct - Sufficient credit."
    }
}

В случае приведенного выше кода вызов службы работал нормально, гарантируя код возврата 200. Однако логика вашего приложения теперь должна обрабатывать сообщение об ошибке.

Если мы используем код состояния HTTP для обозначения ошибки, мы начнем помечаться в наших журналах и т. Д., Даже если технической ошибки не было.

person Roland Stens    schedule 22.04.2016