Photo by Joshua Reddekopp on Unsplash
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 ?
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
HttpClient
deAngular
nous offre une interface appeléeHttpInterceptor
qui 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'interfaceHttpInterceptor
qui 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 valeurtrue
nous 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érateurRxJS
nous permet de capturer un évènementHttpEvent
afin de tester si cet évènement est de typeHttpResponse
. C'est important parce que les évènementsHTTP
sont multiples.catchError
: cet opérateurRxJS
nous 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 :