環境
node => v16.13.2
angular => 15.0.4
AngularでリクエストヘッダーにAuthorizationを共通して持たせたい
とかレスポンスのStatusCode
を見て共通処理を書くと言ったAPIリクエスト前後の処理をどこで実装するのがいいのか調べてみた。
HttpInterceptor
どうやらドンピシャっぽいのがこれで、ドキュメントによると
Intercepts and handles an HttpRequest or HttpResponse.
つまり、リクエストとレスポンスそれぞれに処理をできますよということ。まさに探していた機能に間違いない。
使ってみる
リクエストに対して処理をする
import {
HttpEvent,
HttpHandler,
HttpInterceptor,
HttpRequest,
} from "@angular/common/http";
import { Injectable } from "@angular/core";
import { Observable } from "rxjs";
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor() {}
intercept(
req: HttpRequest<any>,
next: HttpHandler,
): Observable<HttpEvent<any>> {
const newReq = req.clone({
headers: req.headers.set("Authorization", "Bearer " + "token"),
});
// cloneされてヘッダーを付与したリクエストを次の処理に引き渡す
return next.handle(newReq);
}
}
これでリクエストヘッダーにBearer token
というAuthorization
が付与されたうえでリクエストが投げられる。
レスポンスに対して処理をする
import {
HttpEvent,
HttpHandler,
HttpInterceptor,
HttpRequest,
} from "@angular/common/http";
import { Injectable } from "@angular/core";
import { Observable, catchError } from "rxjs";
import { MatDialog } from "@angular/material/dialog";
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
constructor(public dialog: MatDialog) {}
intercept(
request: HttpRequest<any>,
next: HttpHandler,
): Observable<HttpEvent<any>> {
const req = request.clone();
return next.handle(req).pipe(
catchError((res) => {
if (400 <= res.status && res.status < 500) {
console.log("400以上500未満のエラーが発生しました。");
}
return next.handle(req).pipe();
}),
);
}
}
これでレスポンスのstatus
が400以上500未満の場合に限りconsole
が発火するようになった。
これを使用すれば各status
に対する共通の処理を書くことができる。
app.module.ts にプロバイダー登録
それぞれ処理を書いたらapp.module.ts
のproviders
に登録する。
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },
{ provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
],
これで無事に求めている動きをするようになった。