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

Flutter调用API遇SocketException:初始请求失败后续正常求助

解决方案:Flutter初始请求SocketException DNS解析失败问题

问题复盘

触发错误:SocketException (SocketException: Failed host lookup: 'sfh-api-zlkq.onrender.com' (OS Error: No address associated with hostname, errno = 7))
核心特征:仅首次请求失败,后续请求正常;Postman/Chrome调用正常,测试API可成功;已配置INTERNET权限、检查CORS。

针对性解决方案

1. 提前初始化网络栈,预解析域名

Flutter冷启动时,系统网络栈可能未完全就绪,首次DNS解析容易超时。在App启动阶段提前触发域名解析:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 预连接目标域名,触发DNS解析
  try {
    await Socket.connect("sfh-api-zlkq.onrender.com", 443);
  } catch (_) {
    // 忽略预连接失败,不影响后续业务请求
  }
  runApp(MyApp());
}

2. 给首次请求增加超时时间与重试逻辑

默认http请求超时较短,结合Render服务器可能的冷启动延迟,添加超时设置和重试机制:

@riverpod
Future<UserModel?> getUserByToken(
    GetUserByTokenRef getUserByNumberRef, String token) async {
  int retryTimes = 2; // 设置重试次数
  while (retryTimes > 0) {
    try {
      var response = await http
          .get(Uri.parse("${Constants.baseUrl}/user/getByToken"), headers: {
        'Authorization': 'Bearer $token',
      }).timeout(const Duration(seconds: 10)); // 延长超时至10秒
      
      var data = jsonDecode(response.body);
      if (response.statusCode == 200) {
        return UserModel.fromJson(data["user"]);
      } else if (response.statusCode == 404) {
        return null;
      } else if (response.statusCode == 500) {
        Fluttertoast.showToast(msg: data["error"]);
        return null;
      }
    } catch (error) {
      retryTimes--;
      if (retryTimes == 0) {
        Fluttertoast.showToast(msg: error.toString());
        return null;
      }
      // 重试前短暂等待,避免频繁请求
      await Future.delayed(const Duration(seconds: 1));
    }
  }
  return null;
}

3. 检查Android网络安全配置(Android专属)

Android 9及以上默认限制明文流量,但如果自定义了网络安全配置,需确保允许目标域名的HTTPS请求:
创建res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

在AndroidManifest.xml的application标签中引用:

<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">

4. 处理Render服务器休眠问题

Render免费实例会在无请求15分钟后休眠,首次请求需唤醒服务器,这个过程可能导致连接超时。可选解决方式:

  • 升级Render付费方案,开启“始终保持唤醒”
  • 测试阶段可通过定时任务定期ping服务器,避免休眠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:29