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

Posted

技术标签:

【中文标题】为 Flutter http 请求设置请求超时的正确方法?【英文标题】:Proper way of setting request timeout for Flutter http requests? 【发布时间】:2021-10-07 10:33:35 【问题描述】:

我需要为 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()。因此,恕我直言,资源在超时时也不会释放。

【问题讨论】:

或许尝试从Future.timeout 回调中调用HttpClientRequest.abort @jamesdlin 好建议!但我应该怎么称呼它?我正在使用IOClient 【参考方案1】:

使用来自dart:io 的原始HttpClient 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

【讨论】:

听起来很棒 - 非常感谢!但是,我想知道如何在 IOClient 中使用它 - 答案是否没有,完全没有办法?我认为使用我自己的 httpclient 似乎不是一个好方法:/ 天真地,我可以做一些事情,比如创建自己的委托 HttpClient 和 HttpClientRequest,然后在其中做这些事情。但不确定这是否是一个好习惯。 AFAIK 目前无法使用package:http

以上是关于为 Flutter http 请求设置请求超时的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter进行HTTP请求并保存登陆状态(dio)

Flutter进行HTTP请求并保存登陆状态(dio)

在flutter http请求中为所有请求设置默认标头的最佳方法

HTTP超时问题

http超时请求设置

http超时请求设置