Récemment, j'ai utilisé des intercepteurs avec Angular HttpClient.
J'ajoute des en-têtes correspondant à certaines méthodes HTTP GET et, pour certains, je n'ai pas besoin de ces en-têtes.
Comment puis-je dire à mon intercepteur d'ajouter des intercepteurs à ces méthodes uniquement? Je peux même diviser des services, par exemple un service pour les en-têtes et un autre sans en-tête ou un pour différents en-têtes et un pour différents.
Fournisseurs NgModule
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true,
},{
provide: HTTP_INTERCEPTORS,
useClass: AngularInterceptor,
multi: true,
}
MyInterceptors
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const authReq = req.clone({headers: req.headers.set('X-Auth-Token', "-------------------------")});
return next.handle(authReq);
}
}
@Injectable()
export class AngularInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).do(event => {}, err => {
if(err instanceof HttpErrorResponse){
console.log("Error Caught By Interceptor");
//Observable.throw(err);
}
});
}
}
Remarque: je n'ai pas encore essayé cette approche moi-même, mais j'ai joué avec l'idée car nous examinons un problème similaire.
Si nous avions des exigences très simples, il serait trivial d’ajouter de la logique dans un intercepteur à usage général et de décider en fonction de l’URL/de la méthode du type d’interception à effectuer. Cependant, notre application angulaire doit appeler une variété de micro-services de première partie et d’API de tierces parties avec des exigences différentes pour les intercepteurs. C'est effectivement un sur-ensemble de vos besoins.
Une idée à mettre en œuvre consiste à étendre HttpClient à chaque API/service à appeler et à configurer un jeton d'injection personnalisé pour la chaîne d'intercepteurs. Vous pouvez voir comment angular enregistre la valeur par défaut HttpClient
ici :
providers: [
HttpClient,
// HttpHandler is the backend + interceptors and is constructed
// using the interceptingHandler factory function.
{
provide: HttpHandler,
useFactory: interceptingHandler,
deps: [HttpBackend, [new Optional(), new Inject(HTTP_INTERCEPTORS)]],
},
La fonction interceptingHandler
est même exportée en tant que ɵinterceptingHandler
. Je conviens que cela semble un peu bizarre, je ne sais pas pourquoi il porte ce nom d'exportation.
Quoi qu'il en soit, pour utiliser un HttpClients personnalisé, vous pouvez probablement:
export const MY_HTTP_INTERCEPTORS = new InjectionToken<HttpInterceptor[]>('MY_HTTP_INTERCEPTORS');
...
providers: [
MyHttpClient,
{
provide: MyHttpHandler,
useFactory: interceptingHandler,
deps: [HttpBackend, [new Optional(), new Inject(MY_HTTP_INTERCEPTORS)]],
},
Et assurez-vous que MyHttpClient
nécessite une MyHttpHandler
dans son constructeur.