【发布时间】:2017-10-24 06:42:23
【问题描述】:
我有这个拦截器:
import {Observable} from 'rxjs/Observable';
import {Injectable} from '@angular/core';
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse, HttpParams} from '@angular/common/http';
import {SessionStorageService} from 'ng2-webstorage';
@Injectable()
export class HttpInterceptorService implements HttpInterceptor {
constructor(private sessionStorage: SessionStorageService) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const url = '/';
req = req.clone({
url: url + req.url,
headers: req.headers.set('Authorization', this.sessionStorage.retrieve('access_token'))
});
return next.handle(req).catch(err => {
if (err instanceof HttpErrorResponse) {
console.log('interceptor error');
console.log(err);
if (err.status === 401) {
return Observable.throw(err);
}
}
});
}
}
我需要的是在当前过期时获取一个新令牌(结束对某个带有参数的“url”的请求),如果我在任何请求上得到响应 401,然后保持请求(和所有其他请求)直到我得到一个新的令牌。如果 refresh_token 也过期了(也得到了 401),那就做点别的吧。
params: new HttpParams().set('Token', this.sessionStorage.retrieve('refresh_token'))
我不明白如何请求新令牌。
接下来我做了什么
if (err.status === 401) {
const params = new HttpParams().set('token', this.sessionStorage.retrieve('refresh_token'));
req = req.clone({
method:'post',
url: url + '/auth/refresh',
params: params,
headers: req.headers.set('Authorization', this.sessionStorage.retrieve('refresh_token'))
});
next.handle(req).subscribe(res => {
console.log('res',res);
});
return Observable.throw(err);
}
但是我得到了res 和body 以及其他对我的数据来说不必要的东西。我怎样才能从body 只得到data?
当我尝试执行 res.body 或 res._body 或 res.text() 之类的操作时,出现如下错误:
Property '_body' does not exist on type 'HttpEvent<any>'.
Property '_body' does not exist on type 'HttpSentEvent'.
res['body'] 帮助我。但我得到一个字符串数据。当我尝试做JSON.parse(res['body']); 时,我的请求状态是转到cancel。而且我不能做这个请求。
【问题讨论】:
-
你可以试试:
res.json() -
如果你得到
401,这意味着你必须处理HttpErrorResponse类型。那个有属性error˙这是你需要的:它将包含错误响应正文中返回的任何服务器。参考:angular.io/api/common/http/HttpErrorResponse(查看描述部分)
标签: angular typescript httpclient access-token angular2-services