Comment accéder aux informations de l'en-tête (header) de la réponse renvoyée après l'exécution d'une requête HTTP en Angular ?

Je suis Ezéchiel Amen AGBLA, Angular Developer Expert & Ionic Developer Expert, passionné par le développement web et mobile. Je mets la lumière sur des notions liées à Angular et à Ionic pour la communauté francophone.
Dans nos applications Angular, nous sommes amenés à consommer des APIs (Application Programming Interface) fournies par un service backend via le protocole HTTP (HyperText Transfer Protocol). Pour le faire, nous implémentons le service HttpClient disponible dans le noyau de notre framework. Ce service HttpClient nous permet de faire énormément de choses et nous aborderons l'une d'entre elle dans cet article.
Supposons que nous ayons besoin de récupérer une information qui se trouve dans l'en-tête (headers en anglais) de la réponse à notre requête. En effet, pour des raisons de sécurité ou un besoin particulier, notre backend décide de mettre des données au niveau de l'en-tête de la réponse à notre requête. Cette information peut être un token JWT (JSON Web Token), un cookie ou toute autre information cruciale pour notre logique métier.
Le service
HttpClientdeAngularnous offre une interface appeléeHttpInterceptorqui nous permet de manipuler aisément nos requêtes avant, pendant et après leur exécution. C'est une interface très utilisée et très utile.
Voici les étapes à suivre pour récupérer une information qui se trouve au niveau de l'en-tête de la réponse :
1- Créer une classe qui implémente l'interface HttpInterceptor :
import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
HttpEvent
} from '@angular/common/http';
@Injectable({
providedIn: 'root',
})
export class RequestInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>,
next: HttpHandler): Observable<HttpEvent<any>> {
}
}
intercept: c'est la méthode que nous redéfinissons à travers l'interfaceHttpInterceptorqui nous permet d'intercepter une requête afin d'effectuer nos traitements.request: c'est l'objet qui représente notre requête. Nous y trouverons toutes les informations en rapport avec la requête à envoyer vers notre serveur.next: c'est l'objet qui nous permet de passer à l'étape suivante après nos différents traitements afin que notre requête puisse continuer son exécution après avoir été intercepté et subi des traitements.
2- Indiquer à notre module root qu'il doit utiliser cet intercepteur de requête :
import { HTTP_INTERCEPTORS } from '@angular/common/http';
....
providers: [
....
{ provide: HTTP_INTERCEPTORS, useClass: RequestInterceptor, multi: true }
....
]
provide: cet attribut nous permet d'indiquer que le service à exploiter c'estHTTP_INTERCEPTORS.useClass: cet attribut nous permet d'indiquer la classe à utiliser lorsque nous voulons exploiter le serviceHTTP_INTERCEPTORS. Cette classe dans notre cas estRequestInterceptor.multi: cet attribut avec sa valeurtruenous permet de faire pointer différentes classes sur notre service à exploiterHTTP_INTERCEPTORS. Nous pouvons avoir plusieurs classes d'intercepteur de requêtes qui font différents traitements.
3- Ajouter la logique suivante au niveau de la méthode intercept pour avoir accès aux informations de l'en-tête de la réponse à notre requête HTTP :
intercept(request: HttpRequest<any>,
next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
tap((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
console.log('Http response headers : ', event.headers);
}
}),
catchError((error: HttpErrorResponse) => {
console.log('Error ', error);
return throwError(error);
})
);
}
tap: cet opérateurRxJSnous permet de capturer un évènementHttpEventafin de tester si cet évènement est de typeHttpResponse. C'est important parce que les évènementsHTTPsont multiples.catchError: cet opérateurRxJSnous permet de capturer les erreurs provenant de notre requête afin de les traiter convenablement.
En somme, nous avons vu ensemble comment récupérer les informations contenues dans l'en-tête d'une réponse HTTP en utilisant un intercepteur de requêtes. Le service HttpClient que Angular met à notre disposition est tellement puissant qu'il faut prendre le temps de bien l'étudier.
Pour plus d'informations :






