Как сделать модуль angular для игнорирования перехватчика HTTP, добавленного в базовый модуль

У меня есть основной модуль с 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 { }

Ответ 1

В соответствии с этим предложением на 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 })
    ...

Обратите внимание, что с помощью этого метода служба, а не перехватчик, выбирает, когда применяется логика перехватчика; это означает, что службы должны "что-то" знать о перехватчиках в вашем приложении. В зависимости от вашего варианта использования, может быть лучше, чтобы перехватчики решали, когда применять логику.

Ответ 2

Вы можете использовать HttpBackend.

Пример:

import { HttpClient, ..., HttpBackend } from '@angular/common/http';

@Injectable()
export class TestService {

  private httpClient: HttpClient;

  constructor( handler: HttpBackend) { 
     this.httpClient = new HttpClient(handler);
  }
....

Таким образом, служба не перехватывается AuthInterceptor.