Angular2 路由和拦截调用(HTTP API 某处从 2.1.0 版到 2.2.3 版的更改。)
Angular2 routing and intercepting calls (changes in HTTP API somewhere from version 2.1.0 to version 2.2.3.)
(这个问题是 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 输出:
也就是我用私有变量新建headers的时候。由于某种原因,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 调用应该使用控制台日志中显示的新值,但好像没有?
问题如下。在切换到 Angular-2.2.3 之前,我使用了如下函数:
request(url: string, options?: RequestOptionsArgs): Observable<Response> {
...
return this.intercept(super.request(url, this.getRequestOptionsArgs(options)));
}
这行得通,但是在切换到 Angular-2.2.3 之后,url 不再只是一个字符串,它是一个 object,并且它包含令牌,还有。
当我想向 return 上次访问的页面发出新请求时(使用新的 headers 和新的令牌),这并没有被用来进行调用。相反,因为我使用的是 url 里面有令牌,所以使用了这个令牌。
使用url['url']
后所有问题都消失了。
更新
我做了一些重构,在这个过程中发现了以下几点:
在请求函数中是url一个object,在其他方法中是url字符串。
所以如果你往下看:
request(url: string|Request, options?: RequestOptionsArgs) : Observable<Response>
它说 url 也可以将整个请求放入其中,这就是它的作用。
在我的代码中,我有类似的东西:
delete(url: string, options?: RequestOptionsArgs): Observable<Response> {
this.lastMethod = 5;
this.lastUrl = url;
return this.intercept(super.delete(url, this.getRequestOptionsArgs(options)));
}
与 get、post、put...类似
不知何故,在它们之后 (get,put,post...) 是调用的请求命令,现在这个命令本身包含了整个请求,这在我的代码中造成了问题,因为我的函数在这个地方期待字符串。
正如我重复的那样,这之前的功能不同,可能没有调用请求方法,因为这个问题之前不存在...
(这个问题是 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 输出:
也就是我用私有变量新建headers的时候。由于某种原因,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 调用应该使用控制台日志中显示的新值,但好像没有?
问题如下。在切换到 Angular-2.2.3 之前,我使用了如下函数:
request(url: string, options?: RequestOptionsArgs): Observable<Response> {
...
return this.intercept(super.request(url, this.getRequestOptionsArgs(options)));
}
这行得通,但是在切换到 Angular-2.2.3 之后,url 不再只是一个字符串,它是一个 object,并且它包含令牌,还有。
当我想向 return 上次访问的页面发出新请求时(使用新的 headers 和新的令牌),这并没有被用来进行调用。相反,因为我使用的是 url 里面有令牌,所以使用了这个令牌。
使用url['url']
后所有问题都消失了。
更新
我做了一些重构,在这个过程中发现了以下几点:
在请求函数中是url一个object,在其他方法中是url字符串。
所以如果你往下看:
request(url: string|Request, options?: RequestOptionsArgs) : Observable<Response>
它说 url 也可以将整个请求放入其中,这就是它的作用。 在我的代码中,我有类似的东西:
delete(url: string, options?: RequestOptionsArgs): Observable<Response> {
this.lastMethod = 5;
this.lastUrl = url;
return this.intercept(super.delete(url, this.getRequestOptionsArgs(options)));
}
与 get、post、put...类似
不知何故,在它们之后 (get,put,post...) 是调用的请求命令,现在这个命令本身包含了整个请求,这在我的代码中造成了问题,因为我的函数在这个地方期待字符串。 正如我重复的那样,这之前的功能不同,可能没有调用请求方法,因为这个问题之前不存在...