仅针对某些状态代码重试 HTTP 请求

问题描述 投票:0回答:1

在我的 Angular 应用程序中,我想对后端服务器进行 HTTP 调用。为了使其更具弹性,我添加了一个拦截器来实现重试模式。

我曾经利用 RxJS 的

retryWhen
运算符,但现在已弃用,所以我这样做:

return next.handle(copiedRequest).pipe(
  retry({
    count: 5,
    delay: 1000,
  }),
  catchError((error: HttpErrorResponse) => {
    if (error.status === 0) {
      // Server not responding, so stuff
    }
    return throwError(() => error);
  })
);

问题是,这现在适用于我所有的 HTTP 响应状态,而有时当服务器返回某个状态代码时,您知道重试是没有意义的。有没有办法在重试中添加过滤器,以便它可以检查是否实际进行重试?

angular typescript rxjs
1个回答
0
投票

您可以向名为

withRetry:true
的请求添加自定义标头,并在您的
interceptor
中检查它。

服务.ts

checkAuth(){
    const headers = new HttpHeaders({
      'withRetry': true
    });
    return this.http.get(`${this.url}user_auth`, {headers})
  }

拦截器.ts

intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
    const req = request.clone({
      setHeaders: {
        Authorization: `Bearer ${this.cookieService.get('token')}`
      }
    })

    if (request.headers.get('withRetry')) {
      const modifiedRequest = req.clone({
        headers: req.headers.delete('withRetry') // Remove the 'withRetry' header to avoid CORS issues
      });
      return next.handle(modifiedRequest).pipe(
        retry({
          count: 5,
          delay: 1000,
        }),
        catchError((error: HttpErrorResponse) => {
          if (error.status === 0) {
            // Server not responding, so stuff
          }
          return throwError(() => error);
        })
      );
      
    }
    else {
      return next.handle(req).pipe(catchError(x => this.handleAuthError(x))); 
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.