You can find a working example here.
Generalization
Assuming that a request will be intercepted by these interceptors:
@NgModule({
/* ... */
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: Interceptor1
multi: true,
},
{
provide: HTTP_INTERCEPTORS,
useClass: Interceptor2
multi: true,
},
/* ... */
{
provide: HTTP_INTERCEPTORS,
useClass: InterceptorN
multi: true,
}
]
/* ... */
})
When you perform a request by using HttpClient
, the provided interceptors will act symmetrically on the whole action(HttpRequest
& HttpResponse
).
This means that the actual request(HttpRequest
) will be intercepted by the interceptors in this order:
INTERCEPTOR_1 -> INTERCEPTOR_2 -> INTERCEPTOR_3 -> ... -> INTERCEPTOR_n
whereas, the path of the response(HttpResponse
) will be this:
INTERCEPTOR_n -> ... -> INTERCEPTOR_3 -> INTERCEPTOR_2 -> INTERCEPTOR_1
A practical example
Supposing you have these interceptors:
{ type: 0 }
- the request has been dispatched to the backend
export class FooInterceptor implements HttpInterceptor {
intercept (req: HttpRequest<any>, next: HttpHandler) {
console.log('[FOO]: request! ')
return next.handle(req)
.pipe(
// Skip `sent` event
filter(e => e.type !== 0),
tap((e) => console.log('[FOO]: response!', e)),
);
}
}
export class BarInterceptor implements HttpInterceptor {
intercept (req: HttpRequest<any>, next: HttpHandler) {
console.log('[BAR]: request! ')
return next.handle(req)
.pipe(
// Skip `sent` event
filter(e => e.type !== 0),
tap((e) => console.log('[BAR]: response!', e)),
);
}
}
export class BazInterceptor implements HttpInterceptor {
intercept (req: HttpRequest<any>, next: HttpHandler) {
console.log('[BAZ]: request! ')
return next.handle(req)
.pipe(
// Skip `sent` event
filter(e => e.type !== 0),
tap((e) => console.log('[BAZ]: response!', e)),
);
}
}
After dispatching an HTTP request, this will be printed to the console:
[FOO]: request!
[BAR]: request!
[BAZ]: request!
[BAZ]: response!
HttpResponse { … }
[BAR]: response!
HttpResponse { … }
[FOO]: response!
HttpResponse { … }
{userId: 1, id: 1, title: "delectus aut autem", completed: false…}
I hope you found this useful. Thanks for reading! :)
Top comments (0)