page navigationend change angular2 angular http interceptor angular-http-interceptors

navigationend - router events subscribe angular 4



Agregue múltiples interceptores HTTP a la aplicación angular (1)

¿Cómo agregar múltiples interceptores HTTP independientes a una aplicación Angular 4?

Traté de agregarlos ampliando la matriz de providers con más de un interceptor. Pero solo se ejecuta el último, se ignora Interceptor1 .

@NgModule({ declarations: [ /* ... */ ], imports: [ /* ... */ HttpModule ], providers: [ { provide: Http, useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions) => new Interceptor1(xhrBackend, requestOptions), deps: [XHRBackend, RequestOptions], }, { provide: Http, useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions) => new Interceptor2(xhrBackend, requestOptions), deps: [XHRBackend, RequestOptions] }, ], bootstrap: [AppComponent] }) export class AppModule {}

Obviamente podría combinarlos en una sola clase de Interceptor y eso debería funcionar. Sin embargo, me gustaría evitar eso, ya que estos interceptores tienen propósitos completamente diferentes (uno para el manejo de errores, uno para mostrar un indicador de carga).

Entonces, ¿cómo puedo agregar múltiples interceptores?


Http no permite tener más de una implementación personalizada. Pero como @estus mencionó, el equipo de Angular ha agregado recientemente un nuevo servicio angular.io/guide/http (versión 4.3) que admite el concepto de múltiples interceptores. No necesita extender el HttpClient como lo hace con el viejo Http . En su lugar, puede proporcionar una implementación para HTTP_INTERCEPTORS que puede ser una matriz con la opción ''multi: true'' :

import {HTTP_INTERCEPTORS, HttpClientModule} from ''@angular/common/http''; ... @NgModule({ ... imports: [ ... , HttpClientModule ], providers: [ ... , { provide: HTTP_INTERCEPTORS, useClass: InterceptorOne, multi: true, }, { provide: HTTP_INTERCEPTORS, useClass: InterceptorTwo, multi: true, } ], ... })

Interceptores:

import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from ''@angular/common/http''; ... @Injectable() export class InterceptorOne implements HttpInterceptor { intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { console.log(''InterceptorOne is working''); return next.handle(req); } } @Injectable() export class InterceptorTwo implements HttpInterceptor { intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { console.log(''InterceptorTwo is working''); return next.handle(req); } }

Esta llamada al servidor imprimirá los mensajes de registro de ambos interceptores:

import {HttpClient} from ''@angular/common/http''; ... @Component({ ... }) export class SomeComponent implements OnInit { constructor(private http: HttpClient) {} ngOnInit(): void { this.http.get(''http://some_url'').subscribe(); } }