每次重试都会重新计算的动态标头

时间:2018-08-14 10:51:56

标签: angular5 rxjs5 angular-httpclient

我有一个AuthenticatedHttpClient类,该类扩展了HttpClient,并且我的所有服务都使用了该类,以便每个发出的请求都向API提供一个JWT令牌。

我还有一个通用的错误处理程序,该处理程序在令牌过期时处理401响应,并使用刷新令牌刷新令牌,然后应重播原始请求,因此它看起来是无缝的(延迟稍有增加)

一切正常,只是重播的请求中具有在创建时设置的原始标头,因此标头中的JWT令牌现在已过期。

我可以提出两种解决方案...

1)以某种方式编辑重试请求,并更改标头以使用当前令牌

2)(首选)使请求在发送时而不是在创建时检索令牌。

我目前都不知道该怎么做...如果有人告诉我解决方案,我将不胜感激...

在我的AuthenticatedHttpClient中使用重试机制的示例:

public get<T>(endPoint: string, options?: IRequestOptions): Observable<T> {
    console.log('my http client requesting Get');
    return this.http.get<T>(endPoint, options).retryWhen(this.handleErrorAndRetry(this.authService));
}

handleErrorAndRetry定义:

private handleErrorAndRetry(authService: AuthenticationService): (error: any) => any {
  return (error: any) => {
    return error
      .flatMap((err: any) => {
        if (err.status === 401) {
          return authService.refreshTokenObservable()
        }
        return Observable.throw({error: 'No retry'});
      })
      .take(2);
  };
}

在服务中使用AuthenticatedHttpClient的示例:

listEntities(companyId: any): Observable<Entity[]> {
    return this.http.get<Entity[]>(`${this.apiBase}/${this.apiResource}/${companyId}/${this.apiSubResource}`, {
        headers: this.getHeaders()
    });
}

0 个答案:

没有答案