在 angular 2 应用程序中,对 API 的每个请求都有带有 token 的 header ,以防 token 过期 API 以 401 http 代码响应。我有一种更新 token 的方法,但是如何在获取新 token 的过程中重新发送先前暂停其他请求的请求?
最佳答案
您可以扩展 Http
以这种方式类,使用 catch
捕获错误可观察的操作符:
一种方法是扩展 HTTP 对象以拦截错误:
@Injectable()
export class CustomHttp extends Http {
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
super(backend, defaultOptions);
}
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
console.log('request...');
return super.request(url, options).catch(res => {
// do something
});
}
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
console.log('get...');
return super.get(url, options).catch(res => {
// do something
});
}
}
并按如下所述进行注册:
bootstrap(AppComponent, [HTTP_PROVIDERS,
new Provider(Http, {
useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new CustomHttp(backend, defaultOptions),
deps: [XHRBackend, RequestOptions]
})
]);
在
catch
中定义的回调中运算符,您可以调用您的方法来更新 token ,获取结果,在源请求上设置新 token 并再次执行它。这将是完全透明的。这是一个示例:
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return super.get(url, options).catch(res => {
if (res.status === 401) {
return this.getToken().flatMap(token => {
var sourceOptions = options || {};
var headers = sourceOptions.headers || new Headers();
headers.append('Authorization', token); // for example
return super.get(url, options);
});
}
return Observable.throw(res);
});
}
编辑
要“暂停”其他请求,您需要在
getToken
中实现一些缓存。使用 do
的方法和 share
运营商:getToken() {
if (hasTokenExpired()) {
this.token = null;
this.tokenObservable = null;
}
if (this.token) {
// Gotten the new token
return Observable.of(this.token);
} else if (this.tokenObservable) {
// Request in progress...
return this.tokenObservable;
} else {
// Execute the "refresh token" request
return this.get('/refreshToken')
.map(res => res.json)
.do(token => {
this.token = token;
this.tokenObservable = null;
})
.share();
}
}
关于angular - 重新发送请求 Angular 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37306671/