web-dev-qa-db-fra.com

Définit l'en-tête par défaut sur AngularJS mais ne l'utilisez pas sur une requête spécifique

Pour l'envoi du jeton OAuth2, je configure l'en-tête par défaut sur AngularJS comme ceci:

$http.defaults.headers.common['Authorization'] = 'Bearer ' + access_token;

Cela fonctionne très bien, mais je n’ai pas besoin de cet en-tête (je reçois une erreur) pour une requête spécifique.

Existe-t-il un moyen d’exclure l’en-tête des valeurs par défaut lors de l’exécution de cette demande?

Merci!

Résolu

Merci à Riron de m'avoir mis sur le droit chemin. Voici la réponse:

$http({
    method: 'GET',
    url: 'http://.../',

    transformRequest: function(data, headersGetter) {
        var headers = headersGetter();

        delete headers['Authorization'];

        return headers;
    }
});
24
Julius

Lorsque vous effectuez votre appel avec $ http, vous pouvez remplacer les en-têtes par défaut en les fournissant directement dans la configuration de votre demande:

$http({method: 'GET', url: '/someUrl', headers: {'Authorization' : 'NewValue'} }).success();

Sinon, vous pourriez transformer votre demande en utilisant le paramètre transformRequest, toujours dans votre config $ http. Voir doc:

transformRequest - {function(data,headersGetter)|Array.<function(data, headersGetter)>} - transformation ou un tableau de ces fonctions. La fonction de transformation prend Le corps de la requête http et les en-têtes et renvoie sa version transformée (Généralement sérialisée).

De cette façon, vous pouvez supprimer un en-tête pour une requête unique avant son envoi:

$http({method: 'GET', 
       url: '/someUrl', 
       transformRequest: function(data,headersGetter){ //Headers change here } 
}).success();
18
Riron

Pour les retardataires, même si la solution a peut-être fonctionné, vous ne devriez en fait pas avoir besoin d'utiliser transformRequest pour cela.

Les documents Angular du service $ http traitent en fait de cette situation:

Pour supprimer explicitement un en-tête ajouté automatiquement via $ HttpProvider.defaults.headers par requête, utilisez la propriété headers , En définissant l'en-tête souhaité sur undefined . Par exemple:

 var req = {  
      method: 'POST',  
      url: 'http://example.com',  
      headers: {  
           'Content-Type': undefined  
      },  
      data: { 
           test: 'test' 
      } 
 }

 $http(req).success(function(){...}).error(function(){...});
8
Alkie

Angular 1.4.0 ne peut plus modifier les en-têtes de requête à l'aide de transformRequest:

Si vous devez ajouter/supprimer des en-têtes de manière dynamique, vous devez utiliser une fonction d’en-tête , Par exemple:

$http.get(url, {
  headers: {
    'X-MY_HEADER': function(config) {
      return 'abcd'; //you've got access to a request config object to specify header value dynamically
    }
  }
})
6
Brent Washburne

Alors que $httpProvider peut remplacer $http l'utilisation de intereceptors est un moyen de gérer cela, je finis par le faire de cette façon

function getMyStuff(blah) {

        var req = {
            method: 'GET',
            url: 'http://...',
            headers: {
                'Authorization': undefined
            }
        }
        return $http(req)
            .then(function(response) {
                return response.data;
            });


}
0
Tom Stickel