J'essaie d'écrire un intercepteur HTTP pour mon application AngularJS pour gérer l'authentification.
Ce code fonctionne, mais je suis préoccupé par l'injection manuelle d'un service car je pensais qu'Angular est censé gérer cela automatiquement:
app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push(function ($location, $injector) {
return {
'request': function (config) {
//injected manually to get around circular dependency problem.
var AuthService = $injector.get('AuthService');
console.log(AuthService);
console.log('in request interceptor');
if (!AuthService.isAuthenticated() && $location.path != '/login') {
console.log('user is not logged in.');
$location.path('/login');
}
return config;
}
};
})
}]);
Ce que j'ai commencé à faire, mais j'ai rencontré des problèmes de dépendance circulaire:
app.config(function ($provide, $httpProvider) {
$provide.factory('HttpInterceptor', function ($q, $location, AuthService) {
return {
'request': function (config) {
console.log('in request interceptor.');
if (!AuthService.isAuthenticated() && $location.path != '/login') {
console.log('user is not logged in.');
$location.path('/login');
}
return config;
}
};
});
$httpProvider.interceptors.push('HttpInterceptor');
});
Une autre raison pour laquelle je suis préoccupé est que la section sur $ http dans Angular Docs semble montrer un moyen d'obtenir des dépendances injectées de la «manière régulière» dans un intercepteur Http. Voir leur extrait de code sous "Intercepteurs":
// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
return {
// optional method
'request': function(config) {
// do something on success
return config || $q.when(config);
},
// optional method
'requestError': function(rejection) {
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return $q.reject(rejection);
},
// optional method
'response': function(response) {
// do something on success
return response || $q.when(response);
},
// optional method
'responseError': function(rejection) {
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return $q.reject(rejection);
};
}
});
$httpProvider.interceptors.push('myHttpInterceptor');
Où doit aller le code ci-dessus?
Je suppose que ma question est de savoir quelle est la bonne façon de procéder?
Merci et j'espère que ma question était assez claire.
$http
. Le seul moyen que j'ai trouvé est de l'utiliser $injector.get
, mais ce serait bien de savoir s'il existe un bon moyen de structurer le code pour éviter cela.