在我的 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 响应状态,而有时当服务器返回某个状态代码时,您知道重试是没有意义的。有没有办法在重试中添加过滤器,以便它可以检查是否实际进行重试?
您可以向名为
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)));
}
}