代码之家  ›  专栏  ›  技术社区  ›  Matt Fellows

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

  •  1
  • Matt Fellows  · 技术社区  · 8 年前

    我有一个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 回复  |  直到 8 年前
    推荐文章