Angular 7拦截器更改标头并再次重试请求

Sas*_*asa 1 http-headers angular-http-interceptors angular angular7

我正在尝试处理响应标头,在某些特定情况下,当刷新令牌从后端发送时,用新令牌替换标头中的旧令牌并再次发送请求。经过数小时的研究,我没有找到任何适用于 Angular 7 的解决方案。我成功拦截请求,但未能成功替换令牌并再次发送相同的请求。

我这样做:

    export class RefreshTokenInterceptor implements HttpInterceptor {
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return next.handle(req).pipe(
            tap(event => {

            },
            (error: any) => {
                if (error.status == 401 && error.error.token) {
                    // what to do here
                    // error.error.token is new generated token
                }
            })
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。

Sas*_*asa 6

我找到了解决方案:

export class RefreshTokenInterceptor implements HttpInterceptor {
        intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
            return next.handle(req).pipe(
                map((event: HttpEvent<any>) => {
                    return event;
                }),
                catchError((error: HttpErrorResponse) => {
                    if (error.status == 401 && error.error.token) {
                        localStorage.setItem('token', error.error.token);

                        req = req.clone({headers: req.headers.set('Authorization', 'Bearer ' + error.error.token)});
                        req = req.clone({headers: req.headers.set('Accept', 'application/json')});

                        return next.handle(req);
                    }
                }));
        }
    }
Run Code Online (Sandbox Code Playgroud)