web-dev-qa-db-fra.com

Comment créer un module angular pour ignorer un intercepteur http ajouté dans un module principal)

J'ai un module de base avec un HttpInterceptor pour la gestion des autorisations et j'inclus ce module dans AppModule, de cette manière, tous les autres modules qui utilisent HttpClient utilisent cet intercepteur.

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

Comment faire en sorte qu'un module contourne l'intercepteur par défaut?

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

Vous pouvez utiliser HttpBackend.

Exemple:

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

@Injectable()
export class TestService {

  private httpClient: HttpClient;

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

De cette manière, le service n'est pas intercepté par AuthInterceptor.

87
deg

Per cette suggestion sur GitHub, nous avons implémenté un en-tête simple pour identifier les requêtes qui ne devraient pas être interceptées. Dans l'intercepteur:

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
  }

}

Ensuite, chaque fois que vous souhaitez ignorer l'interception pour une requête particulière:

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

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

Notez qu'avec cette méthode, le service et non l'intercepteur choisit le moment où la logique de l'intercepteur est appliquée; cela signifie que les services doivent "connaître" quelque chose sur les intercepteurs de votre application. En fonction de votre cas d'utilisation, il peut être préférable de laisser les intercepteurs décider quand appliquer la logique.

43
jonrsharpe