web-dev-qa-db-fra.com

Comment accéder aux en-têtes de réponse en utilisant $ resource dans Angular?

J'appelle essentiellement des requêtes get comme ceci:

var resource = $resource('/api/v1/categories/:id')

resource.get({id: 1}).$promise.then(function(data){
  console.log(data)
})

Cela fonctionne bien .. mais comment obtenir les en-têtes de réponse?

19
Nathan

Vous pouvez utiliser l'action transformResponse définie ici cela vous permettrait d'ajouter les en-têtes

$resource('/', {}, {
    get: {
        method: 'GET',
        transformResponse: function(data, headers){
            response = {}
            response.data = data;
            response.headers = headers();
            return response;
        }
    }

Voir un exemple de travail ici JSFiddle

39
Martin

La réponse de @ Martin fonctionne pour les mêmes demandes de domaine. Je voudrais donc ajouter à sa réponse que si vous utilisez des demandes interdomaines, vous devrez ajouter un autre en-tête avec Access-Control-Expose-Headers: X-Blah, X-Bla avec le Access-Control-Allow-Origin:* entête.

X-Blah et X-Bla sont des en-têtes personnalisés.

De plus, vous n'avez pas besoin d'utiliser la demande de transformation pour obtenir les en-têtes. Vous pouvez utiliser ce code:

var resource = $resource('/api/v1/categories/:id')

resource.get({id: 1}, function(data, headersFun){
  console.log(data, headersFun());
})

Voir ce violon. J'espère que cela t'aides !!!

18
vinesh

Vieille question, mais je pense que cela vaut la peine d'être mentionné pour la future référence. Il existe une solution "officielle" pour cela dans la documentation angular:

Il convient de noter que le rappel de réussite pour get, query et d'autres méthodes est transmis dans la réponse provenant du serveur ainsi que dans la fonction getter d'en-tête $ http, de sorte que l'on pourrait réécrire l'exemple ci-dessus et accéder aux en-têtes http comme suit:

var User = $resource('/user/:userId', {userId:'@id'});

var users = User.query({}, function(users, responseHeaders){
  // ...
  console.log(responseHeaders('x-app-pagination-current-page'));
});

(code des documents légèrement mis à jour pour plus de clarté)

Pour les demandes CORS, exposer les en-têtes comme mentionné dans les autres réponses est requis.

6
rastasheep