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
相关产品推荐
相关产品推荐

