Повторная отправка неразрешенных запросов после смены токена в Angualr8 - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в angular 8. У меня есть перехватчик:

export class HttpRequestInterceptor implements HttpInterceptor {
    private apiAddress = 'http://localhost:1080';
    private refreshTokenIsInProgress = false;
    intercept(
        request: HttpRequest<any>,
        next: HttpHandler
    ): Observable<HttpEvent<any>> {
        let cloneReq;
        //...
        // some codes like adding access token to header
        //...

        cloneReq = request.clone();
        return next.handle(cloneReq)
            .pipe(
                catchError((error: any) => {
                    if(error.status==401)//means token expired
                      {
                         //Here i need help
                         //Get NEW Token And Replace With previous And Resend Current Request
                      }
                    return of(error);
                })
            )
            ;
    }
}
export const httpInterceptorProviders = [
    { provide: HTTP_INTERCEPTORS, useClass: HttpRequestInterceptor, multi: true },
];

мои запросы похожи на:

return this.http.get(url).subscribe();

Как я уже говорил, если запрос возвращает 401 ( не авторизован) Мне нужно получить новый токен (JWT) с сервера, заменить его на предыдущий и затем повторно отправить CURRENT-запрос; нет проблем с получением нового токена! проблема заключается в замене нового токена и повторной отправке запроса;

я искал и гуглил форму много часов, но ... я думал, что смогу достичь ее с помощью retry () и retryWhen ( ) , но они не могут изменять параметры запроса. спасибо всем дружище

1 Ответ

0 голосов
/ 27 марта 2020

Не тестировал код, но вы можете попробовать заключить запрос в функцию более высокого порядка и получить доступ к объекту запроса, а также разрешить рекурсивный вызов функции до тех пор, пока не будет выполнено условие.

      const repeatRequest=(cloneReq)=>next.handle(cloneReq)
        .pipe(
            catchError((error: any) => {
                 if(error.status==401)//means token expired
                  req=........ // modify your request here
                  return repeatRequest(req)
                return of(error);
            })
        )
        cloneReq = request.clone();

        return repeatRequest(cloneReq)
...