← Angular コース
48. インターセプター — すべての通信に共通処理を差し込む
インターセプターは、アプリから出ていくすべてのHTTPリクエストと、返ってくるレスポンスに共通処理を差し込む仕組みです。現在は HttpInterceptorFn 型の関数として書くのが標準で、(req, next) を受け取り、リクエストを加工してから next(req) で次へ渡します。登録は provideHttpClient(withInterceptors([...])) に関数を並べるだけです。
実務での代表例は認証トークンの付与です。ログイン後のAPI呼び出しには毎回 Authorization ヘッダーが必要ですが、各コンポーネントで付けて回るのは現実的ではありません。インターセプターに1か所書けば全リクエストに自動で付きます。ほかにも、通信ログの記録、共通のエラー処理、ローディング表示の集中管理などに使われます。
つまずきやすいのは、リクエストのオブジェクトが読み取り専用(イミュータブル)である点です。req.headers に直接代入することはできず、req.clone({ setHeaders: {...} }) で複製を作って渡します。また、withInterceptors に並べた順にリクエストが通るため、ログ用と認証用など複数ある場合は順番も意識しましょう。
サンプルコード(フレームワーク環境が必要なため表示のみ)
import { HttpInterceptorFn, provideHttpClient, withInterceptors } from '@angular/common/http';
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';
// 関数型インターセプター: すべてのリクエストに認証トークンを付ける
const authInterceptor: HttpInterceptorFn = (req, next) => {
const token = localStorage.getItem('token');
if (!token) {
return next(req); // トークンがなければそのまま通す
}
// リクエストは読み取り専用なので clone で複製して渡す
const authed = req.clone({
setHeaders: { Authorization: 'Bearer ' + token },
});
return next(authed);
};
// withInterceptors に並べた順にリクエストが通る
bootstrapApplication(AppComponent, {
providers: [provideHttpClient(withInterceptors([authInterceptor]))],
});
サンプルコードで身につける(5本) →
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗