Search code examples
javascriptangularangular-routingangular4-httpclient

HTTP_INTERCEPTOR for specific routes in Angular 4+


I have created HTTP_INTERCEPTOR, I need it to work on some specific routes and some others not.

At the begining it was in the main app module file, then I removed it from there and add it in some modules,but it still work on all routes , then i added it in component.ts but not worked at all.

{
            provide: HTTP_INTERCEPTORS,
            useClass: AuthExpiredInterceptor,
            multi: true,
            deps: [Injector]
},

Solution

  • It's not possible to only specify an interceptor for certain routes and/or modules.

    However, you can add a http header value that skips applying the interceptor for that request. For Example:

    import { HttpHeaders } from '@angular/common/http';
    export const InterceptorSkip = 'X-Skip-Interceptor';
    export const InterceptorSkipHeader = new HttpHeaders({
      'X-Skip-Interceptor': ''
    });
    

    then in my Error handler Interceptor if the header is applied, do not catch the error and handle it, instead, let it bubble up to my services and components.

    @Injectable()
    export class ErrorHandlerInterceptor implements HttpInterceptor {
      intercept(request: HttpRequest<any>,next: HttpHandler
      ): Observable<HttpEvent<any>> {
        if (request.headers && request.headers.has(InterceptorSkip)) {
          const headers = request.headers.delete(InterceptorSkip);
          return next.handle(request.clone({ headers }));
        }
        return next.handle(request).pipe(catchError(this.processError));
      }
    
    
      ...
    
    }
    

    then anytime you have a HTTP request you want to be ignored add the InterceptorSkipHeader to the request

    this.http.get<ResponseModel>('api/url', { headers : InterceptorSkipHeader });