Comment utiliser angularJS intercepteur à seulement intercepter des requêtes http spécifiques?
Je sais comment intercepter TOUTES les demandes, mais je ne veux intercepter les demandes de mes ressources.
Personne ne sait comment faire cela?
services.config(['$httpProvider',function($httpProvider) {
$httpProvider.interceptors.push('myHttpInterceptor');
}]);
services.factory("userPurchased", function ($resource) {
return $resource("/api/user/purchases/:action/:item",
{},
{
'list': {method: 'GET', params: {action: 'list'}, isArray: false},
'save': {method: 'PUT', params: {item: '@item'}},
'remove': {method: 'DELETE', params: {item: '@item'}},
}
);
});
services.factory('myHttpInterceptor', function($q,$rootScope) {
//$rootScope.showSpinner = false;
return {
response: function(response) {
$rootScope.showSpinner = false;
//do something on success
console.log('success');
console.log('status', response.status);
//return response;
return response || $q.when(response);
},
responseError: function(response) {
//do something on error
$rootScope.showSpinner = true;
console.log('failure');
console.log('status', response.status)
//return response;
return $q.reject(response);
}
};
});
Vous devez vous connecter pour publier un commentaire.
Si vous voulez intercepter seules les demandes de ressources spécifiques, vous pouvez utiliser l'option
interceptor
propriété de$request
action. Angulaire de la documentation voir ici (Utilisation>actions)JavaScript
Plunker: http://plnkr.co/edit/xjJH1rdJyB6vvpDACJOT?p=preview
Le seul moyen que je connaisse de faire ce qu'il suffit de filtrer les demandes que vous voulez dans la réponse du gestionnaire.
par exemple
Polyfill pour la chaîne.startsWith()
indexOf('/api/') > -1
devrait également fonctionnerMon manière préférée est d'utiliser un HTTP intercepteur qui remplace un "magie" en-tête d'Autorisation auprès de l'actuel jeton OAuth. Le code ci-dessous est OAuth spécifiques, mais remédier que c'est un simple exercice pour le lecteur.
Authorization
en-tête de "Porteur" / "la magie de la chaîne" à vos demandes (et aucune autre), et de l'intercepteur sera appelée. Vous pouvez utiliser la accepté de répondre - et c'est sans doute plus évident - mais signifie que vous êtes attachant que l'intercepteur dans le monde - alors que la méthode dans mon exemple, propose d'indirection.Par défaut angulaire envoie et reçoit application/json en-têtes. Vous pouvez l'obtenir sur la tête de réponse HTTP, comme :
Je viens de tomber sur un problème où les googleapis utilise également un
Authorization
en-tête, et lançait une réponse 401 parce que le JWT-je utiliser sur mon serveur n'est pas valide pour leur serveur (évidemment), et mon code est automatiquement configuré pour supprimer mon jeton et de rediriger la personne vers la page de connexion. (Il n'était pas écrit super bien, car TOUTE réponse 401 pourrait ouvrir une session mon utilisateur).Je suis juste venu avec cette solution, à mon
request
méthode de l'intercepteur, qui, je pense, fonctionne assez bien:La
request
méthode vérifie si j'ai un jeton dans le local de stockage ET si l'url de la requête est faite sur le même hôte (que je reçois de$location.host()
) ainsi que celle de ma page est sur. Cela fonctionne pour localhost ainsi que tout autre URL que j'ai en fin de déployer mon site sur.Je n'ai pas fait beaucoup de tests avec ce, donc si quelqu'un trouve une faille dans cette s'il vous plaît laissez-moi savoir 🙂