Подтвердить что ты не робот

AngularJS Перехватить все $http JSON ответы

У меня есть приложение, построенное с использованием AngularJS и серверной стороны, которая предоставляет все запросы в форме JSON. Каждый запрос заверяется в контейнер JSON, который содержит переменную данных, которая содержит данные, специфичные для запроса. Другие данные, которые используются для сохранения состояния и управления внутри приложения, проверяют наличие ошибок и сообщений об успешном завершении работы и проверяют флаги сеанса. Все эти другие переменные подаются с КАЖДОМ запросом и проверяются перед переменной данных.

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

$http.get('something.json').success(function(response) {
   var data = examineJSONResponse(response);
   //do the data stuff
});

Это работает, и метод studyJSONResponse рассматривает код, и если что-то не так, он выдает исключение и перезагружает страницу, используя window.location.href.

Есть ли способ, которым я могу автоматизировать это в AngularJS, чтобы каждый раз, когда был получен вызов $http, он проверяет это и ТОЛЬКО возвращает содержимое переменной данных как ответ JSON?

4b9b3361

Ответ 1

Вы можете перехватить ответы, добавив перехватчик в $httpProvider.interceptors с помощью Angular 1.1.4+ (см. документацию здесь поиск перехватчиков).

Для определенного типа контента, такого как json, вы можете отклонить изменения или выбросить исключение, даже если вызов был успешным. Вы можете изменить response.data, который также будет передан в ваш код контроллера:

myModule.factory('myHttpInterceptor', function ($q) {
    return {
        response: function (response) {
            // do something on success
            if(response.headers()['content-type'] === "application/json; charset=utf-8"){
                // Validate response, if not ok reject
                var data = examineJSONResponse(response); // assumes this function is available

                if(!data)
                    return $q.reject(response);
            }
            return response;
        },
        responseError: function (response) {
            // do something on error
            return $q.reject(response);
        }
    };
});
myModule.config(function ($httpProvider) {
    $httpProvider.interceptors.push('myHttpInterceptor');
});

ПРИМЕЧАНИЕ. Вот оригинальный ответ для версий до версии 1.1.4 (responseInterceptors устарели с помощью Angular 1.1.4):

Может быть, есть лучший способ, но я думаю, что вы можете сделать что-то похожее на этот пост с помощью HTTP-перехватчика (описанный здесь) (для определенного типа контента, такого как json), где вы потенциально отклоняете изменения или генерируете исключение, даже несмотря на то, что вызов был успешным. Вы можете изменить response.data, который также будет передан в ваш код контроллера.

myModule.factory('myHttpInterceptor', function ($q) {
    return function (promise) {
        return promise.then(function (response) {
            // do something on success
            if(response.headers()['content-type'] === "application/json; charset=utf-8"){
                // Validate response if not ok reject
                var data = examineJSONResponse(response); // assumes this function is available

                if(!data)
                    return $q.reject(response);
            }
            return response;
        }, function (response) {
            // do something on error
            return $q.reject(response);
        });
    };
});
myModule.config(function ($httpProvider) {
    $httpProvider.responseInterceptors.push('myHttpInterceptor');
});

Ответ 2

Другое решение - создать службу и использовать ее вокруг переменной $http.

angular.module('App', [])
  .factory('myHttp',['$http',function($http) {
    return function(url, success, failure) {
      $http.get(url).success(function(json) {
          var data = examineJSONResponse(json);
          data && data.success ? success() : failure();
        }).error(failure);
      );
    }
}]);

И теперь это можно вызвать как:

myHttp(url, onSuccess, onFailure);