我在前端使用TypeScript的Angular 2。我正在尝试实现在每个请求上设置授权标头的http拦截器。如果访问令牌过期,我正在尝试重试该请求,请在重试之前使用带有刷新令牌的新访问令牌并更改当前请求的标头。
如何在retryWhen运算符中更新请求标头?
例如,这里是HttpInterceptor:
export class HttpInterceptor extends Http {
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return super.get(url, this.setRequestAuthorizationHeader(options)).retryWhen((errors: any) => this.errorHandler(errors));
}
private setRequestAuthorizationHeader(options?: RequestOptionsArgs): RequestOptionsArgs {
// some checks
// get accessToken from localStorage
options.headers.append('Authorization', 'Bearer ' + accessToken);
}
private errorHandler(errors) {
return errors.switchMap((err) => {
if (err.status === 401) {
let closedSubject = new Subject();
this.authenticationService.refreshToken()
.subscribe(data => {
// How to update authorization header? This doesn't work.
this.defaultOptions.headers.append('Authorization', 'Bearer ' + data.accessToken);
closedSubject.next();
});
return …Run Code Online (Sandbox Code Playgroud) 我尝试在 Visual Studio 2017 中的文件中使用$(SolutionDir)或,但它们无法按预期工作。$(SolutionPath).csproj
在 MSBuild 15 类型项目(例如 .NET Core、.NET Standard 类库)中,使用$(SolutionDir)in a<PostBuildEvent>有效,但$(ProjectDir)只会生成一个空字符串。
In 其他元素(例如AssemblyFilein UsingTask)$(SolutionDir)生成一个空字符串并$(SolutionPath)给出当前项目目录。
此问题已通过https://developercommunity.visualstudio.com/content/problem/11118/postbuild-event-and-macros-issues.html向 Microsoft 报告,但该问题已标记为“已关闭”,因为问题已修复在 RTM 中,尽管有几个人报告发布版本存在问题。