2016-12-13 15 views
2

这个问题是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输出:

enter image description here

这就是当我使用私有变量来创建新的头。出于某种原因,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调用应该使用控制台日志中显示的新值,但它看起来好像没有?

+0

你可以发布整个流吗?从你的代码中,我不明白为什么在returnLastMethod()后应该执行'refreshToken()'。 – olsn

+0

如果你的日志看起来不错,那么问题必须在'super.get(...)'的地方,这是直接由Angular Http继承吗?还是有你们自己的一类? – olsn

+0

我现在看到它,在url中有一个我应该使用的url ['url']。不知道为什么它以前工作,但现在我需要这样使用。似乎网址有一个带有令牌的字段,并且一直使用它来进行第二个调用?无论如何,我已经使用只有url的剥离版本,它的工作原理。现在我没有耐力来查看以前编译器中的url内容。 现在,我们将尝试查看本地存储的内容,如果更新本身,那么我将对问题/答案进行更新。 感谢您的光临。 –

回答

2

的问题是以下。切换到角2.2.3之前,我使用的功能如下所示:

request(url: string, options?: RequestOptionsArgs): Observable<Response> { 
    ... 
    return this.intercept(super.request(url, this.getRequestOptionsArgs(options))); 
} 

这个工作,但切换到角2.2.3后,网址是不是只是一个字符串的任何更多的,它是一个对象,它也包含令牌。

当我想让返回上次访问的页面的新请求(新报头,和新的令牌),这不是用来拨打电话。相反,因为我正在使用里面有令牌的url,所以使用了这个令牌。

使用url['url']后所有问题就消失了。

更新

我已经做了一些重构,并在这个过程中发现了以下工作:

在请求功能是URL的对象,在别人的方法是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,把...

不知何故,在他们之后(GET,PUT,POST ...)是请求命令叫,这个命令现在有自己的整个请求,并在我的代码中创建问题,因为我的函数期望在这个地方的字符串。 正如我再说一遍,这之前的功能不同,可能没有调用请求方法,因为这个问题以前不存在...

+0

有用的答案,谢谢。当你得到片刻时,你会“自我接受”吗?为此,请单击左侧的刻度线,以使其变为绿色。这标志着它解决了。 – halfer

+1

我会的,我需要再等10个小时....我已经更新了问题和答案以反映新的发现,它是打破它的角度包版本。 –