Angular 2拦截器的Angular 2模拟解决方案是什么

问题描述:

刷新access_token过期时遇到问题。问题是很少有服务一次向服务器发送请求,我需要解决方案来处理所有这些服务,刷新令牌一次并重复它们。Angular 2拦截器的Angular 2模拟解决方案是什么

+0

要再次通过服务获得新的刷新令牌呼叫服务(当刷新令牌到期时)? –

你可以实现一个扩展了HTTP一个类:

@Injectable() 
export class CustomHttp extends Http { 
    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) { 
     super(backend, defaultOptions); 
    } 

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { 

     console.log('request...'); 

     return super.request(url, options);   
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<Response> { 

     console.log('get...'); 

     return super.get(url, options); 
    } 
} 

引导您的应用程序时注册它:

bootstrap(AppComponent, [HTTP_PROVIDERS, ROUTER_PROVIDERS, 
    provide(Http, { 
     useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new CustomHttp(backend, defaultOptions), 
     deps: [XHRBackend, RequestOptions] 
    }) 
]); 

这样,您就能够拦截所有请求在Angular2中。

在此级别,您可以检查令牌到期日期并执行刷新令牌请求。 flatMap操作符将帮助您在此等待执行刷新令牌请求以执行传输请求。

看到这个代码示例:

request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { 
    return me.authService 
      .refreshAuthenticationObservable() 
      //Use flatMap instead of map 
      .flatMap((authenticationResult:AuthenticationResult) => { 
        if (authenticationResult.IsAuthenticated == true) { 
        // retry with new token 
        me.authService.setAuthorizationHeader(request.headers); 
        return super.request(url, request); 
        } 
        return Observable.throw(initialError); 
    }); 
} 

详情请参见这个问题:

+0

嗨,蒂埃里,代码----返回me.authService ----这个会在哪里,为什么这需要一个自定义的http实现? – shiv

+0

嘿嘿。我们需要一个自定义的http类来透明地截取所有请求,而无需更新现有的代码(http调用)。你是对的“返回me.authService ...”。我更新了答案。 –

Observable.forkJoin(
    this.http.get('/app/1').map((res:Response) => res.json()), 
    this.http.get('/app/2').map((res:Response) => res.json()) 
).subscribe(
    data => { 
    this.a = data[0] 
    this.b = data[1] 
    refreshToken(); 
    }, 
    err => console.error(err) 
);