承認処理用のHttpInterceptorを備えたコアモジュールがあり、このモジュールをAppModuleに含めます。これにより、HttpClientを使用する他のすべてのモジュールがこのインターセプターを使用します。
@NgModule({
imports: [],
declarations: [],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true,
},
]
})
export class CoreModule { }
モジュールにデフォルトのインターセプターをバイパスさせる方法は?
@NgModule({
imports: [
CommonModule
],
declarations: components,
providers: [CustomService],
exports: components,
})
export class ModuleWithoutInterceptorModule { }
HttpBackendを使用できます。
例:
import { HttpClient, ..., HttpBackend } from '@angular/common/http';
@Injectable()
export class TestService {
private httpClient: HttpClient;
constructor( handler: HttpBackend) {
this.httpClient = new HttpClient(handler);
}
....
この方法では、サービスはAuthInterceptorによってインターセプトされません。
GitHubの この提案 ごとに、単純なヘッダーを実装して、インターセプトされるべきではないリクエストを識別しました。インターセプターで:
export const InterceptorSkipHeader = 'X-Skip-Interceptor';
@Injectable()
export class SkippableInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (req.headers.has(InterceptorSkipHeader)) {
const headers = req.headers.delete(InterceptorSkipHeader);
return next.handle(req.clone({ headers }));
}
... // intercept
}
}
その後、特定のリクエストのインターセプトをスキップしたいときはいつでも:
const headers = new HttpHeaders().set(InterceptorSkipHeader, '');
this.httpClient
.get<ResponseType>(someUrl, { headers })
...
このメソッドでは、インターセプターのロジックが適用されるときに、インターセプターではなく、serviceが選択することに注意してください。これは、サービスがアプリケーションのインターセプターについて何かを「知る」必要があることを意味します。ユースケースによっては、ロジックを適用するタイミングをinterceptorsに決定させる方が良い場合があります。