2016-06-06 3 views
3

У меня есть приложение angularjs, в котором у меня есть перехватчик, который добавляет токен авторизации в заголовок каждого запроса.Как пропустить перехватчик angularjs для запроса HTTP?

Однако, где-то в приложении мне нужно использовать и внешний API, где перехватчик разрушает его, поскольку он добавляет этот заголовок авторизации, который неприемлем для этого внешнего поставщика API. Как я могу заставить angularjs HTTP пропускать перехватчик, только в этом конкретном случае?

Перехватчик код ниже:

app.factory('authInterceptorService', ['$q', '$injector', '$location', 'localStorageService', function ($q, $injector, $location, localStorageService) { 
    var authInterceptorServiceFactory = {}; 
    var $http; 

    var _request = function (config) { 

     config.headers = config.headers || {}; 

     var authData = localStorageService.get('authorizationData'); 
     if (authData) { 
      //console.log("token: " + authData.token.substring(0, 10)); 
      //console.log("user: " + authData.userName); 
      config.headers.Authorization = 'Bearer ' + authData.token; 
     } 
     return config; 
    } 

    var _responseError = function (rejection) { 
     var deferred = $q.defer(); 
     if (rejection.status === 401) { 
      var authService = $injector.get('authService'); 
      authService.refreshToken().then(function (response) { 
       _retryHttpRequest(rejection.config, deferred); 
      }, function() { 
       authService.logOut(); 
       $location.path('/login'); 
       deferred.reject(rejection); 
      }); 
     } else { 
      deferred.reject(rejection); 
     } 
     return deferred.promise; 
    } 

    var _retryHttpRequest = function (config, deferred) { 
     console.log('retrying'); 
     $http = $http || $injector.get('$http'); 
     $http(config).then(function (response) { 
      deferred.resolve(response); 
      //console.log("success:" +response); 
     }, function (response) { 
      deferred.reject(response); 
      //console.log("error:" + response); 
     }); 
    } 

    authInterceptorServiceFactory.request = _request; 
    authInterceptorServiceFactory.responseError = _responseError; 

    return authInterceptorServiceFactory; 
}]); 
+0

добавить логику, чтобы пропустить добавление Идента заголовка на основе 'config.url' – harishr

+1

Я думаю, вы должны принять добыча на этом посту: http://stackoverflow.com/questions/23696202/set-defaults-header-on-angularjs-but-dont-use-it-on-one-specific-request –

ответ

3

Simple. Измените эту строку

if (authData) { 

в

if (authData && !config.headers.hasOwnProperty('Authorization')) { 

И для любого запроса, где вы не хотите, заголовок применяется, используйте

$http({ 
    headers { Authorization: null }, 
    // and the rest 
}) 
7

Easy

$http.get("url" , {noAuth : true}).then(success(),error()); 

В перехватчик

var _request = function (config) { 

    config.headers = config.headers || {}; 

    var authData = localStorageService.get('authorizationData'); 
    if (authData && !config.noAuth) { 
     //console.log("token: " + authData.token.substring(0, 10)); 
     //console.log("user: " + authData.userName); 
     config.headers.Authorization = 'Bearer ' + authData.token; 
    } 
    return config; 
} 
6

Написать, как это: -

var _request = function (config) { 
    if (config.url.indexOf('yourExternalApiUrl') > -1) { 
     return config; 
    } else { 
     config.headers = config.headers || {}; 
     var authData = localStorageService.get('authorizationData'); 
     if (authData) { 
      //console.log("token: " + authData.token.substring(0, 10)); 
      //console.log("user: " + authData.userName); 
      config.headers.Authorization = 'Bearer ' + authData.token; 
     } 
    return config; 
    }   
} 

Для получения более подробной информации вы можете увидеть: http://www.codemosquitoes.com/2016/06/using-angularjs-interceptors-with-http.html

Смежные вопросы