【发布时间】:2016-08-06 07:49:08
【问题描述】:
我正在尝试在基于 Angular2 的 Ionic2 应用程序中重现我使用 Angular 1.x 拦截器和承诺成功实现的以下行为:
- 拦截 HTTP 请求错误
-
如果状态码是401,那么
一个。再次请求注册客户端。这将提供一些令牌,我随后可以将其附加到每个请求。
b.重试原始请求,并通过 promise / observable 将结果提供给调用者
如果错误状态不是 401,就让正常流向调用者
注意:注册过程不需要用户的任何干预(无需登录),因此我希望它对用户完全透明。我在第一次加载应用时注册了一次,但会话最终会过期,我需要自动重新注册。
这是最初的 Angular 1 实现(我只包括了拦截器的responseError部分):
responseError : function(rejection){
if(rejection.status == 401){
$log.info('Intercepting unauthorized 401 response. Will try to re-register the session and retry the request.');
var security = $injector.get('SecurityService');
var $http = $injector.get('$http');
return security.registerSession().then(function(){
return $http(rejection.config);
});
}else{
return rejection;
}
}
现在,我已经包装了 Angular2 的 HTTP 服务,我可以做一些简单的事情,比如为每个请求添加一个标头。但是,我正在努力使用 Angular2 和 Observables 重现相同的行为。
到目前为止我的尝试,这是我的服务将调用的 HTTP 包装器的请求方法:
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
let req: Request = this.buildRequest(url, options);
this.beforeCall(req);
var observable = this.http
.request(req)
.retry(3)
.catch(res => {
debugger;
console.log("ERROR! " + res.status);
if(res.status == 401){
this.logger.log('Unauthorized request. Trying to register the session and then retry the request.');
return this.securityService.registerSession().subscribe(() => {
// What to do here so the client gets the result of the original request ??
});
}
})
.do((res:Response) => { this.afterCall(req, res) });
return observable;
}
【问题讨论】:
-
@Günter :相关但不是欺骗 IMO。我想处理包装器内的错误并对其进行处理,然后重试。他想向调用者返回错误反馈。
-
这个方案实施了吗?我一直在尝试做同样的事情,但没有任何成功。如果您可以发布完整的解决方案,那将非常有帮助。
标签: typescript angular rxjs