Я нахожусь на перепутье с некоторым дизайном API для клиента (JS в браузере), чтобы общаться с сервером. Мы используем HTTP 409 Conflict для представления сбоя действия из-за действующей блокировки безопасности. Замок Satefy предотвращает случайное внесение разработчиками изменений в производственные системы наших клиентов. Мне было поручено немного более изящно обрабатывать 409-е на клиенте, чтобы указать, почему не удался конкретный вызов API.
Мое решение состояло в том, чтобы обернуть обработчики сбоев любого из наших вызовов AJAX, которые будут отображать уведомление на клиенте, когда что-то выходит из строя из-за 409 - это все хорошо и работает хорошо наряду с другими ошибками 4XX и 5XX, которые используют тот же механизм.
Возникла проблема, когда один из наших обработчиков маршрутов отвечает 409 при обнаружении ошибки бизнес-логики - моя оболочка AJAX сообщает, что включена защитная блокировка, в то время как существующий обработчик ошибок клиента сообщает, что (по его мнению) проблема основана на теле ответа. Простым решением было бы изменить либо ответ обработчика, либо код состояния, который мы используем для представления замка безопасности.
Что подводит меня к перекрестку: следует ли использовать коды состояния HTTP даже для представления ошибок бизнес-логики? Этот вопрос решает ту же проблему, с которой я сталкиваюсь, но он не получил большой тяги. Как указано в связанном ответе, я склоняюсь к использованию HTTP 200 OK с соответствующим телом для представления ошибок в бизнес-логике.
У кого-нибудь есть здесь сильные мнения? Кто-нибудь может убедить меня, что это неправильный способ представлять неудачу?
400 Bad Request
. Причина такого разделения заключается в том, что будущие системы, разработчики или читатели документов могут быть сбиты с толку вашим отклонением от мирового стандарта.400 Bad Request
в качестве общего кода HTTP кажется наилучшим для охвата ошибок бизнес-логики как класса.400 Bad Request
когда данные отсутствуют или не могут быть прочитаны / проанализированы. Т.е. сами данные запроса в некотором роде плохие.Ответы:
Кейси раскрывает главное.
Ключевая идея в любом веб-API: вы адаптируете свой домен, чтобы он выглядел как хранилище документов. GET / PUT / POST / DELETE и так далее - все это способы взаимодействия с хранилищем документов.
Так в способе мышления о том , что коды использования, чтобы понять , что аналогичная операция в документе магазине, и что эта неудача будет выглядеть в этом аналоге.
2xx совершенно не подходит
5xx тоже не подходит
В этом случае сервер не ошибся; он знает, что вы не должны изменять этот ресурс в это время.
Ошибки бизнес-логики (это означает, что бизнес-инвариант не позволяет предлагаемое редактирование в настоящее время), вероятно, 409
Обратите внимание на этот последний бит - полезная нагрузка ответа 409 должна сообщать потребителю информацию о том, что пошло не так, и в идеале должна включать средства управления гипермедиа, которые приводят потребителя к ресурсам, которые могут помочь разрешить конфликт.
И я бы указал на это как на проблему; Ваша реализация на клиенте предполагала, что кода состояния было достаточно для определения проблемы. Вместо этого ваш клиентский код должен проверять полезную нагрузку и действовать на основе доступной там информации.
То есть, в конце концов, как это сделает хранилище документов?
Тот же подход с a
400 Bad Request
также будет приемлемым; что примерно "переводит на" возникла проблема с вашим запросом. Мы не можем быть обеспокоены, чтобы выяснить, какой код статуса подходит лучше всего, так что вот и все. Смотрите полезную нагрузку для деталей. "Спецификация WebDAV включает эту рекомендацию
Я не верю, что это вполне совпадает (хотя я согласен, что
400
в качестве альтернативы это вызывает некоторые сомнения ). Моя интерпретация422
означает, что «вы отправили неправильную сущность», где409
«вы отправили сущность в неправильное время».Другими словами,
422
указывает на проблему с сообщением запроса, рассматриваемым изолированно, где409
указывается, что сообщение запроса конфликтует с текущим состоянием ресурса.Обсуждение Беном Надалем 422 может быть полезным для рассмотрения.
источник
По моему опыту, кодов ошибок HTTP недостаточно для представления ошибок бизнеса. Однако они полезны для представления классов ошибок.
Поэтому я рекомендую использовать коды ошибок HTTP для категорий ошибок, но выбрать конкретную ошибку для сбоев бизнес-логики (например, 409 Conflict ... 200 OK будет вводить в заблуждение здесь) и включить в ответ данные, указывающие на конкретную бизнес-ошибку , Убедитесь, что это часть содержимого ответа, а не текста статуса, поскольку некоторые браузеры игнорируют пользовательский текст статуса. Язык, который я люблю использовать, имеет типы объединения, которые удобны для представления сообщений. Но вы также можете определить строковые константы для случаев ошибки.
Примеры
источник
Как правило, я бы не использовал коды состояния HTTP для представления конкретных ошибок бизнес-логики. Это потому, что они уже имеют семантическое значение, которое определяется мировым стандартом. Другие системы, новые разработчики и т. Д. Будут сбиты с толку вашим отклонением от стандарта.
В недавнем подобном исследовании я обнаружил, что общепринятым является использование
400 Bad Request
в случае ошибок валидации и тому подобное. Таким образом, вы используете один код состояния для всех ошибок бизнес-логики.Кстати, его
409
следует использовать, когда ресурс изменился, когда вы редактировали его и пытались сохранить его снова.источник
Вы можете использовать «Неверный запрос» и включить идентификатор нарушенного бизнес-правила, а также некоторые подробности в теле ответа.
источник