Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

222
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda