Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

225
Vistas
Cambie el encabezado en HTTP antes de volver a intentar un Observable

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()); } }); } }
about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda