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

fzy*_*cjy 12 http dart flutter

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

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

然而,我担心:那.timeout是课堂上的方法Future。因此,即使超时,http请求仍然持续进行!换句话说,如果 http 请求实际上需要 30 秒才能完成,并且我们使用timeout(Duration(seconds: 5)),那么即使看起来我们已经中止了请求,但实际上仍然花费了用户手机的资源另外 25 秒秒

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

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

jam*_*lin 13

使用 的原始HttpClientAPI ,您可以在超时时dart:io通过调用来取消 HTTP 请求:HttpClientRequest.abortFuture

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

然而,HttpClientRequest.abort(截至撰写本文时)是最近添加的,目前它还没有在package:http.