angular 4.3x动态http拦截器
我从medium创建了一个http拦截器,它允许我向每个http调用添加头angular 4.3x动态http拦截器,angular,typescript,angular-http-interceptors,Angular,Typescript,Angular Http Interceptors,我从medium创建了一个http拦截器,它允许我向每个http调用添加头 @Injectable() export class TokenInterceptor implements HttpInterceptor { constructor(public auth: AuthService) {} intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any&
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
constructor(public auth: AuthService) {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${this.auth.getToken()}`
}
});
return next.handle(request);
}
}
本文使用authService动态获取令牌。然而,一旦我将HttpClient注入AuthService,我就会得到一个循环注入错误
还有其他方法可以动态调整拦截器吗?在AngularJS和AngularJS中避免循环依赖的传统方法是让另一个提供程序实例就位,而不是在提供程序实例化上:
export class TokenInterceptor implements HttpInterceptor {
constructor(public auth: AuthService, public injector: Injector) {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const httpClient = injector.get(HttpClient);
...
}
}
注意,如果拦截器应用于所有HttpClient请求,它将应用于拦截器本身内部完成的请求,并可能导致无限递归。为了避免这种情况,可以将请求标记为跳过拦截器,例如通过自定义标头。从中,它表示:
应该注意的是Angular的新HttpClient来自
@此处使用的是angular/common/http,而不是来自的http类
@angular/http。如果我们试图用传统的
Httpclass,拦截器不会被击中
请确保您正在使用来自“@angular/common/http”的导入{HttpClient};在导入部分
然后它的构造函数使用它:constructorpublic http:HttpClient{}你能在发起请求的地方共享你的服务代码吗?在这种情况下,使用Injector非常有用。假设您有TranslateService,它依赖于HttpClient和HttpInterceptor,HttpInterceptor用于从JSON加载翻译,而interceptor本身依赖于翻译服务在请求中发送locale参数。你得到一个循环。