为 Flutter http 请求设置请求超时的正确方法?

时间:2021-08-02 00:40:16

标签: flutter http dart

我需要为 http 请求设置超时时间。

我已阅读 Set timeout for HTTPClient get() request,它建议我们使用 http.get(...).timeout(...)

但是,我很担心:.timeoutFuture 类中的一个方法。因此,即使超时,http请求仍在进行中!换句话说,如果 http 请求实际上需要,比如说,30 秒来完成,而我们使用 timeout(Duration(seconds: 5)),那么即使看起来好像我们已经中止了请求,它实际上仍然消耗资源用户的手机再停留 25 秒

因此,如果有适当的方法可以使请求超时,我将不胜感激。或者,如果我错了,请纠正我。

附言我知道还有一件事,HttpClient.connectionTimeout。那是连接阶段,而不是整个请求的时间。有趣的是,当我进入源代码 see here 时,我发现它内部也使用了 some_future.timeout()。因此,恕我直言,资源也不会在超时时释放。

1 个答案:

答案 0 :(得分:2)

使用来自 HttpClient 的原始 dart:io API,您可以在 Future 超时时调用 HttpClientRequest.abort 取消 HTTP 请求:

import 'dart:async';
import 'dart:io' as io;

Future<void> main(List<String> args) async {
  var slowUrl = args.first;
  var httpClient = io.HttpClient();
  var request = await httpClient.getUrl(Uri.parse(slowUrl));
  try {
    var response = await request
        .close()
        .then(
          (_) => print('Got eventual response'),
        )
        .timeout(
          const Duration(seconds: 1),
        );
  } on TimeoutException catch (_) {
    print('Timed out');
    request.abort();
  }
}

当使用响应缓慢的 URL 运行时,上面应该打印“超时”而不是“得到最终响应”。

然而,HttpClientRequest.abort 是(在撰写本文时)最近添加的,而 currently it is not exposed in package:http