111 votes

Comment créer un module angulaire pour ignorer l'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 façon, 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 { }
 

290voto

deg Points 866

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.

113voto

jonrsharpe Points 34770

Par cette suggestion sur GitHub, nous avons mis en œuvre un en-tête simple à identifier les demandes qui ne devrait 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
  }

}

Alors à chaque fois que vous voulez sauter l'interception pour une demande particulière:

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

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

À noter qu'avec cette méthode, le service, pas de l'intercepteur, est de choisir le moment de l'intercepteur de la logique qui est appliquée, ce qui signifie que les services doivent "savoir" quelque chose à propos de la intercepteurs dans votre application. Selon votre cas d'utilisation, il peut être préférable de faire les intercepteurs de décider à quel moment appliquer la logique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X