加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular HttpClient默认和特定请求超时

发布时间:2020-12-17 08:01:31 所属栏目:安全 来源:网络整理
导读:通常希望具有将应用于所有请求的默认超时(例如30s),并且可以针对特定的更长请求(例如600s)覆盖。 据我所知,在Http中没有指定默认超时的好方法。 在HttpClient中解决这个问题的方法是什么? 如何为所有传出请求定义默认超时,可以覆盖特定的超时? 似乎在没
通常希望具有将应用于所有请求的默认超时(例如30s),并且可以针对特定的更长请求(例如600s)覆盖。

据我所知,在Http中没有指定默认超时的好方法。

在HttpClient中解决这个问题的方法是什么?
如何为所有传出请求定义默认超时,可以覆盖特定的超时?

似乎在没有扩展HttpClientModule类的情况下,拦截器与各个请求通信的唯一预期方式是params和header对象。

由于超时值是标量,因此可以安全地将其作为自定义标头提供给拦截器,在此可以确定是否应该通过RxJS超时运算符应用它的默认或特定超时:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/timeout';

const DEFAULT_TIMEOUT = new InjectionToken<number>('defaultTimeout');
const defaultTimeout = 10000;

@Injectable()
export class TimeoutInterceptor implements HttpInterceptor {
  constructor(@Inject(DEFAULT_TIMEOUT) protected defaultTimeout) {}

  intercept(req: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {
    const timeout = Number(req.headers.get('timeout')) || this.defaultTimeout;
    return next.handle(req).timeout(timeout);
  }
}

  ...
  providers: [
    [{ provide: HTTP_INTERCEPTORS,useClass: TimeoutInterceptor,multi: true }],[{ provide: DEFAULT_TIMEOUT,useValue: defaultTimeout }]
  ],...

然后使用自定义超时标头完成请求

http.get(...,{ headers: new HttpHeaders({ timeout: `${20000}` }) });

由于标头应该是字符串,因此应该首先将超时值转换为字符串。

这是a demo。

积分转到@RahulSingh和@ Jota.Toledo建议使用具有超时的拦截器的想法。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读