angular 4.3x动态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&

我从medium创建了一个http拦截器,它允许我向每个http调用添加头

@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参数。你得到一个循环。