Я предпочитаю использовать HTTP-перехватчик для своих ошибок API. Это довольно простая задача.
Что делать? Поскольку имя говорит, что оно перехватывает каждый ответ, который проходит через HTTP-сервис и, соответственно, службу ресурсов.
Мой подход состоит из двух частей.
Сначала ResponseHandler
завод:
app.factory('ResponseHandler', responseHandler);
responseHandler.$inject = ['$q', '$log'];
function responseHandler ($q, $log) {
return {
response: responseHandler,
responseError: responseErrorHandler
};
function responseHandler (response) {
$log.info('HTTP response ', response);
// success cases go through here
return response;
}
function responseErrorHandler (rejection) {
$log.error('HTTP error ', rejection);
// error cases go through here
return $q.reject(rejection);
}
}
и вторая часть, фактическая «активация» в ResponseHandler
в поставщике HTTP:
app.config(errorInterceptor);
errorInterceptor.$inject = ['$httpProvider']
function errorInterceptor ($httpProvider) {
$httpProvider.interceptors.push('ResponseHandler');
}
Я надеюсь, что этот маленький пример дает понять, как интегрировать его в угловое приложение. В моем случае, например, я обрабатываю большинство случаев ошибок непосредственно в responseErrorHandler
, уведомив все приложение с тостами.
В основном я полагаюсь на состояние ошибки (например, 401 или 403), чтобы выполнить специальные действия. Я не знаю, нужно ли вам больше, но я бы посоветовал вам «играть» со статусом и форматом ответов.
Например: Если у вас есть ошибка проверки на стороне сервера в форме, вы, вероятно, не хотите лечить это на этом фундаментальном уровне. Поэтому я отправляю специальную ошибку проверки с кодом состояния 200, который проходит через перехватчик, но затем поймается, как обычно, в .then(..)
.
Спасибо за ответ. Главный вопрос здесь заключается в том, как включить перехватчик для всех ответов и как переключиться, если выключить для определенных. Мне не нравится, что ваша идея отправляет 200 код статуса для ошибок, потому что в этом случае ваш бэкэнд полагается на архитектуру вашего интерфейса, что неправильно по дизайну. –
Может быть, нужен пример. В моем случае есть некоторые ошибки, как я описал, которые отличаются от общих ошибок API. Я думал, что вы можете быть в аналогичной ситуации, где эта связь имеет смысл. То, что я в конечном счете хотел показать, состоит в том, что вы можете сделать любое условие в errorInterceptor, где вы просто разрешаете ответ, так что он фактически отключен. – FlorianTopf