2015-04-29 28 views
34

Zastanawiam się, czy istnieje sposób na skonfigurowanie wszystkich nagłówków żądań $ http z dodaniem niestandardowych informacji. Coś jak config:

var config = {headers: { 
      'Authorization': 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ==', 
      'Accept': 'application/json;odata=verbose' 
     } 
    }; 

Ale dla wszystkich połączeń HTTP http będę robić w różnych serwisach. Jestem pewien, że istnieje rozwiązanie: D.Thanks

+0

możliwe duplikat [Interceptor dla wszystkich żądań HTTP w angularjs 1.0.x] (http://stackoverflow.com/questions/20062493/interceptor-for-all-http-requests-in-angularjs-1- 0-x) – Julien

Odpowiedz

63

Można utworzyć $http przechwytywania przedłużyć swój nagłówek:

myapp.factory('httpRequestInterceptor', function() { 
 
    return { 
 
    request: function (config) { 
 

 
     config.headers['Authorization'] = 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ=='; 
 
     config.headers['Accept'] = 'application/json;odata=verbose'; 
 

 
     return config; 
 
    } 
 
    }; 
 
}); 
 

 
myapp.config(function ($httpProvider) { 
 
    $httpProvider.interceptors.push('httpRequestInterceptor'); 
 
});

+0

Może być głupim pytaniem, ale dlaczego token autoryzacji ma przedrostek "Basic"? – TheLittleNaruto

+0

to tylko przykład :) – alexsc

+3

@TheLittleNaruto Nagłówek 'Authorization' ma kilka domyślnych opcji, takich jak' Basic base64encodedStringSeperatedWithA: 'lub' Trwające tokenString' w formie 'Authorization: ' który jest standardem w całym Internecie. –

16

Prostszym rozwiązaniem mogłoby być wykorzystanie run blok kątowej za :

app.run(['$http', function ($http) { 
    $http.defaults.headers.common['Authorization'] = 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ=='; 
    $http.defaults.headers.common['Accept'] = 'application/json;odata=verbose'; 
}]); 

Uwaga: to rozwiązanie pozwala przekazać wartość statyczną tylko raz, ponieważ blok run jest uruchamiany tylko raz.

+6

Problem z tym, jeśli użytkownik loguje się po uruchomieniu nie ma jeszcze tokena autoryzacji, dlatego lepiej użyj przechwytywacza – goldylucks

+0

Tak, wiem o tym, ale odpowiedziałem zgodnie z pytaniem, ponieważ autor chciał dodać nagłówek w ** all ** request :-) –

+0

Próbuję tego w kanciarze v1.0.6, ale właściwość "common" nie istnieje. Jakieś pomysły? –

0
use the folllowing code and you can also control $http timeout from 
config setting.  
'use strict'; 
    var app = angular.module('b2capp', []); 
    var apiRequestCount = 0;  
    app.config(function ($httpProvider) { 
     $httpProvider.interceptors.push(function ($rootScope, $q) { 
     return { 
      request: function (config) { 
       apiRequestCount++; 
       // config.timeout =300000; 
       return config; 
      }, 
      response: function (response) { 
       return response; 
      }, 
      responseError: function (rejection) { 
      switch (rejection.status) { 
        case 408: 
         console.log('connection timed out'); 
         break; 
       } 
       // return $q.reject(rejection); 
       return rejection; 
      } 
      } 
     }) 
    }); 
}]); 
    app.controller('myCtrl', function ($scope, $http, $timeout) { 
    var headers = { 
      //'Authorization': 'Basic ' + btoa(username + ":" + password), 
       'Access-Control-Allow-Origin': true, 
       'Content-Type': 'application/json; charset=utf-8', 
       "X-Requested-With": "XMLHttpRequest" 
       } 
    $http.post(url + 'Search_6e', reqCookie, { 
        headers 
      }) 
      .then(function Success(response) {    
       $scope.myData = resultData; 
       console.log($scope.myData); 
      }, function myError(response) { 
       //error code 
    }); 
Powiązane problemy