(这个问题是HTTP API在某些版本2.1.0和2.2之间变化的结果.3这可能是最好只是看看答案,因为这些变化的影响也解释)Angular2路由和拦截调用(HTTP API从版本2.1.0到版本2.2.3的变化)
这里是序列我:我拦截通话
,...如果需要刷新令牌,并进行了第二HTTP调用:
intercept(observable: Observable<Response>): Observable<Response> {
return observable.catch((err: any, caught: Observable<Response>) => {
...
return this.refreshtoken().flatMap((res) =>
this.returnLastMethod(returnMethod, returnUrl, returnData));
在refreshToken():
localStorage.setItem('accessToken', x);
在的returnLastMethod内的一种方法我做了
let accessToken = localStorage.getItem('accessToken')
,因此我总是从一个HTTP调用之前的访问令牌。现在,这是一个在切换到Angular ver:2.2.3之前工作的代码,但仍然存在,但显然我在这里丢失了一些东西,因为它在Angular-2.2.3中不起作用。
这里是Chrome输出:
这就是当我使用私有变量来创建新的头。出于某种原因,Http调用使用其他值,就好像它只是重复旧的Http调用(在控制台日志中显示新值是我给该方法的值)。
,我给新值到第二HTTP调用该函数的代码:
private returnLastMethod(typ: number, url: string, data?: any): Observable<Response> {
let lastMethodOptions = new RequestOptions();
lastMethodOptions.headers = new Headers();
let accessToken1 = this.currentAccessToken;
console.log(accessToken1 + ' - set to Bearer');
lastMethodOptions.headers.append('Authorization', 'Bearer ' + accessToken1);
lastMethodOptions.headers.append('Content-Type', 'application/json');
switch (typ) {
case 1:
console.log('url: ' + url + ' options: ');
for (let i = 0; i < lastMethodOptions.headers.values().length; i++) { console.log(lastMethodOptions.headers.values()[i]); };
return super.request(url, lastMethodOptions);
case 3:
console.log('url: ' + url + ' options: ');
for (let i = 0; i < lastMethodOptions.headers.values().length; i++) { console.log(lastMethodOptions.headers.values()[i]); };
return super.put(url, data, lastMethodOptions);
case 4:
console.log('url: ' + url + ' options: ');
for (let i = 0; i < lastMethodOptions.headers.values().length; i++) { console.log(lastMethodOptions.headers.values()[i]); };
return super.post(url, data, lastMethodOptions);
case 5:
console.log('url: ' + url + ' options: ');
for (let i = 0; i < lastMethodOptions.headers.values().length; i++) { console.log(lastMethodOptions.headers.values()[i]); };
return super.delete(url, lastMethodOptions);
default:
console.log('url: ' + url + ' options: ');
for (let i = 0; i < lastMethodOptions.headers.values().length; i++) { console.log(lastMethodOptions.headers.values()[i]); };
return super.get(url, lastMethodOptions);
};
}
我不明白我在做什么错。新的Http调用应该使用控制台日志中显示的新值,但它看起来好像没有?
你可以发布整个流吗?从你的代码中,我不明白为什么在returnLastMethod()后应该执行'refreshToken()'。 – olsn
如果你的日志看起来不错,那么问题必须在'super.get(...)'的地方,这是直接由Angular Http继承吗?还是有你们自己的一类? – olsn
我现在看到它,在url中有一个我应该使用的url ['url']。不知道为什么它以前工作,但现在我需要这样使用。似乎网址有一个带有令牌的字段,并且一直使用它来进行第二个调用?无论如何,我已经使用只有url的剥离版本,它的工作原理。现在我没有耐力来查看以前编译器中的url内容。 现在,我们将尝试查看本地存储的内容,如果更新本身,那么我将对问题/答案进行更新。 感谢您的光临。 –