web-dev-qa-db-ja.com

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 { }
38
Alexandru Olaru

HttpBackendを使用できます。

例:

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

@Injectable()
export class TestService {

  private httpClient: HttpClient;

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

この方法では、サービスはAuthInterceptorによってインターセプトされません。

87
deg

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に決定させる方が良い場合があります。

43
jonrsharpe