You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新http包后移动网络连接失败、API卡顿,WiFi正常求技术协助

解决方案:更新http包后移动网络下API连接异常问题

1. 回退到稳定版本

先降级http包至之前无问题的版本,在pubspec.yaml中指定具体版本号:

dependencies:
  http: ^0.13.5 # 替换为你之前使用的稳定版本

执行flutter pub get后测试移动网络是否恢复正常,这是最快验证问题是否由新版本引入的方式。

2. 自定义IOClient配置适配移动网络

新版本http包可能修改了默认连接参数,手动调整IOClient的配置来适配移动网络特性:

import 'package:http/http.dart' as http;
import 'dart:io';

// 创建自定义Client
final customClient = http.IOClient(
  HttpClient()
    // 设置连接超时,避免移动网络下长时间等待
    ..connectionTimeout = const Duration(seconds: 10)
    // 闲置连接超时,释放资源
    ..idleTimeout = const Duration(seconds: 30)
    // 限制单主机并发连接数,适配移动网络带宽
    ..maxConnectionsPerHost = 3
    // 强制使用HTTP/1.1(部分移动网络对HTTP/2支持不佳)
    ..forceHTTP1 = true
);

// 使用自定义Client发起请求
Future<void> fetchData() async {
  try {
    final response = await customClient.get(Uri.parse('你的API地址'));
    // 处理响应
  } catch (e) {
    // 捕获异常
  } finally {
    customClient.close();
  }
}

3. 对齐旧版本请求头

移动运营商可能拦截请求头变化的请求,手动设置和旧版本http包一致的请求头:

final response = await customClient.get(
  Uri.parse('你的API地址'),
  headers: {
    'User-Agent': 'Dart/2.19 (dart:io)', // 旧版本http默认UA
    'Connection': 'keep-alive',
    'Accept-Encoding': 'gzip',
  },
);

4. 开启日志排查细节

添加日志拦截,定位移动网络下请求失败的具体阶段(DNS解析、连接建立、握手等):

HttpClient()
  ..findProxy = (uri) {
    print('[DNS] 解析地址: $uri');
    return HttpClient.findProxyFromEnvironment(uri);
  }
  ..onRequest = (request) {
    print('[请求] ${request.method} ${request.uri}');
    request.headers.forEach((key, value) => print('[请求头] $key: $value'));
  }
  ..onResponse = (response) {
    print('[响应] 状态码: ${response.statusCode}');
  }
  ..onError = (error) {
    print('[错误] 详情: $error');
  };

根据日志输出判断是网络层面的问题还是http包的配置问题。

5. 替代方案:切换至dio包

如果http包新版本的兼容性问题无法解决,可迁移至dio包,它提供更灵活的配置和更好的移动网络适配:

dependencies:
  dio: ^5.3.2

dio的配置示例:

import 'package:dio/dio.dart';

final dio = Dio(BaseOptions(
  connectTimeout: const Duration(seconds: 10),
  receiveTimeout: const Duration(seconds: 10),
  httpClientAdapter: DefaultHttpClientAdapter()
    ..onHttpClientCreate = (client) {
      client.forceHTTP1 = true;
      return client;
    },
));

// 使用dio发起请求
final response = await dio.get('你的API地址');

内容的提问来源于stack exchange,提问作者Ankit Tripathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:53:15