向Angular Application添加多个HTTP拦截器 [英] Add multiple HTTP Interceptors to Angular Application
问题描述
如何向Angular 4应用程序添加多个独立的HTTP拦截器?
How to add multiple, independent HTTP interceptors to an Angular 4 application?
我试图通过扩展提供程序来添加它们
包含多个拦截器的数组。但只有最后一个实际执行, Interceptor1
被忽略。
I tried to add them by extending the providers
array with more than one interceptors. But only the last one is actually executed, Interceptor1
is ignored.
@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 {}
我显然可以将它们组合成一个 Interceptor
类,这应该是工作。但是,我想避免这种情况,因为这些拦截器有完全不同的目的(一个用于错误处理,一个用于显示加载指示符)。
I could obviously combine them into a single Interceptor
class and that should work. However, I would like to avoid that as these interceptors have completely different purposes (one for error handling, one to show a loading indicator).
那么如何添加多个拦截器?
So how can I add multiple interceptors?
推荐答案
Http
不允许有多个自定义实现。但正如@estus提到的那样,Angular团队最近添加了一个新的 HttpClient 服务(版本4.3),该服务支持多个拦截器概念。您不需要像使用旧的 Http
那样扩展 HttpClient
。你可以为 HTTP_INTERCEPTORS
提供一个实现,它可以是一个带有'multi:true'
选项的数组:
Http
doesn't allow to have more than one custom implementation. But as @estus mentioned the Angular team has added a new HttpClient service recently (release 4.3) which supports multiple interceptors concept. You don't need to extend the HttpClient
as you do with the old Http
. You can provide an implementation for HTTP_INTERCEPTORS
instead which can be an array with the 'multi: true'
option:
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,
}
],
...
})
拦截器:
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);
}
}
此服务器调用将打印两个拦截器的日志消息:
This server call will print both interceptors' log messages:
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();
}
}
这篇关于向Angular Application添加多个HTTP拦截器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!