首页 > 解决方案 > 每次重试时重新计算的动态标头

问题描述

我有一个扩展 HttpClient 的 AuthenticatedHttpClient 类,我的所有服务都使用它,以便发出的每个请求都向 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()
    });
}

标签: angular5rxjs5angular-httpclient

解决方案


推荐阅读