web-dev-qa-db-de.com

Wie erstelle ich ein angular Modul, um den in einem Kernmodul hinzugefügten http-Interceptor zu ignorieren?

Ich habe ein Kernmodul mit einem HttpInterceptor für die Berechtigungsbearbeitung und binde dieses Modul in AppModule ein. Auf diese Weise verwenden alle anderen Module, die HttpClient verwenden, diesen Interceptor.

@NgModule({
  imports: [],
  declarations: [],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: AuthInterceptor,
      multi: true,
    },
  ]
})
export class CoreModule { }

Wie kann ein Modul den Standard-Interceptor umgehen?

@NgModule({
  imports: [
    CommonModule
  ],
  declarations: components,
  providers: [CustomService],
  exports: components,
})
export class ModuleWithoutInterceptorModule { }
38
Alexandru Olaru

Sie können HttpBackend verwenden.

Beispiel:

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

@Injectable()
export class TestService {

  private httpClient: HttpClient;

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

Auf diese Weise wird der Dienst von AuthInterceptor nicht abgefangen.

87
deg

Per dieser Vorschlag haben wir auf GitHub einen einfachen Header implementiert, um Anfragen zu identifizieren, die nicht abgefangen werden sollten. Im Abfangjäger:

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
  }

}

Dann, wann immer Sie das Abfangen für eine bestimmte Anfrage überspringen möchten:

const headers = new HttpHeaders().set(InterceptorSkipHeader, '');

this.httpClient
    .get<ResponseType>(someUrl, { headers })
    ...

Beachten Sie, dass bei dieser Methode der Dienst und nicht der Abfangjäger wählt, wann die Logik des Abfangjägers angewendet wird. Dies bedeutet, dass die Dienste etwas über die Interzeptoren in Ihrer Anwendung "wissen" müssen. Je nach Anwendungsfall ist es möglicherweise besser, die Interzeptoren zu veranlassen, wann die Logik angewendet werden soll.

43
jonrsharpe