Estoy usando Angular 2 con TypeScript en el front-end. Estoy tratando de implementar un interceptor http que configura el encabezado de autorización en cada solicitud. Si el token de acceso caduca, intento volver a intentar la solicitud, obtengo un nuevo token de acceso con el token de actualización y cambio el encabezado de la solicitud actual, antes del reintento.
¿Cómo actualizar el encabezado de la solicitud en el operador retryWhen?
Por ejemplo, aquí está el HttpInterceptor:
export class HttpInterceptor extends Http { get(url: string, options?: RequestOptionsArgs): Observable<Response> { return super.get(url, this.setRequestAuthorizationHeader(options)).retryWhen((errors: any) => this.errorHandler(errors)); } private setRequestAuthorizationHeader(options?: RequestOptionsArgs): RequestOptionsArgs { // some checks // get accessToken from localStorage options.headers.append('Authorization', 'Bearer ' + accessToken); } private errorHandler(errors) { return errors.switchMap((err) => { if (err.status === 401) { let closedSubject = new Subject(); this.authenticationService.refreshToken() .subscribe(data => { // How to update authorization header? This doesn't work. this.defaultOptions.headers.append('Authorization', 'Bearer ' + data.accessToken); closedSubject.next(); }); return <any>closedSubject; } else { return Observable.throw(err.json()); } }); } }Usaría catch en lugar de retryWhen , ya que este último reproduce el mismo observable y los parámetros ya se han establecido.
Por cierto, su Asunto es inútil en errorHanlder :
export class HttpInterceptor extends Http { get(url: string, options ? : RequestOptionsArgs): Observable < Response > { return super.get(url, this.setRequestAuthorizationHeader(options)).catch(errors => this.errorHandler(errors, url, options)) }); } private setRequestAuthorizationHeader(options ? : RequestOptionsArgs): RequestOptionsArgs { // some checks // get accessToken from localStorage options.headers.append('Authorization', 'Bearer ' + accessToken); return options } private errorHandler(err: any, url: string, options ? : RequestOptionsArgs) { if (err.status === 401) { return this.authenticationService.refreshToken() .switchMap(data => { // save accessToken to localStorage return super.get(url, this.setRequestAuthorizationHeader(options)); }); } return Observable.throw(err.json()); } También tenga en cuenta que usar un estado como this.defaultOptions probablemente no sea su mejor opción, usar un observable sería más apropiado.