(Cette question est le résultat des changements dans l'API HTTP quelque part entre les versions 2.1.0 et 2.2 . .3 Il peut être préférable de simplement regarder la réponse, que les effets des changements sont expliqués il)Angular2 routage et interception d'appels (changements dans l'API HTTP quelque part de la version 2.1.0 à la version 2.2.3.)
Voici la séquence que j'ai.
J'intercepter un appel, ... , actualisez un jeton si nécessaire et effectuez un second appel 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));
En refreshToken():
localStorage.setItem('accessToken', x);
Dans l'une des méthodes à l'intérieur du returnLastMethod je fais un
let accessToken = localStorage.getItem('accessToken')
et par conséquent je reçois toujours le jeton d'accès d'un appel Http avant. Maintenant, c'est un code qui a fonctionné avant de basculer vers Angular ver: 2.2.3, et qui le fait toujours, mais évidemment, il me manque quelque chose ici car il ne fonctionne pas dans Angular-2.2.3.
Voici la sortie Chrome:
C'est quand j'utilise la variable privée pour créer de nouveaux en-têtes. Pour une raison quelconque, l'appel Http utilise une autre valeur, comme s'il ne faisait que répéter l'ancien appel Http (dans le journal de la console, la nouvelle valeur est celle que je donne à la méthode).
Le code de la fonction où je donne la nouvelle valeur au deuxième appel 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);
};
}
Je ne comprends pas ce que je fais mal. Le nouvel appel Http devrait utiliser la nouvelle valeur qui est affichée dans le journal de la console, mais il semble que ce n'est pas le cas?
Pourriez-vous publier l'ensemble du flux peut-être? De votre code, je ne vois pas pourquoi 'refreshToken()' devrait être exécuté après 'returnLastMethod()'. – olsn
Si votre journal semble très bien, alors le problème doit être quelque part avec le 'super.get (...)' est-ce directement hérité par Angular Http? Ou y a-t-il une classe à vous entre les deux? – olsn
Je le vois maintenant, dans url il y a une url ['url'] que j'aurais dû utiliser. Je ne sais pas pourquoi cela a fonctionné avant, mais maintenant je dois l'utiliser ainsi. Semble-t-il que url avait aussi un champ avec un jeton, et l'a utilisé pour faire le second appel? Quoi qu'il en soit, j'ai utilisé la version dépouillée avec juste l'url et ça marche. Je n'ai aucune endurance maintenant pour regarder le contenu de l'URL dans le compilateur précédent. Je vais maintenant essayer de voir ce qui est avec localstorage, si cela se met à jour ou non, alors je ferai une mise à jour à la question/réponse. Merci pour votre présence. –