angular5 - 每次重试时重新计算的动态标头
问题描述
我有一个扩展 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()
});
}
解决方案
推荐阅读
- android - 如何在android中单击按钮时向JSONObject添加值?
- json - 将 JSON 数据解析为 ORA-40441 时出错:JSON 语法错误
- c# - 如何将 ProcessStartInfo 写入 Linux 的文本文件
- php - 学说获得销量最多的产品
- sql - MongoDB超时查询
- algorithm - 删除左倾红黑树及其不变量
- c# - WebRoot 和 ContentRoot 用于更改 ASP.NET Core 应用程序的“Web 部件”位置的目的?
- swift - 带有日期选择器工具栏的 iOS 14 错误
- javascript - 在 Next JS 中访问 JSON 对象中的数据
- ios - 在 SwiftUI `DatePicker` 中点击日期时如何捕获?