Flutter项目调用Swagger API遇Failed host lookup错误求助
问题排查与解决方案
错误核心分析
Failed host lookup: 'admin.sports.com.kg' 本质是DNS解析失败,程序无法找到目标域名对应的服务器地址,常见诱因包括服务端故障、网络权限缺失、协议限制等。
分步排查与修复
1. 验证API服务可用性
- 直接在浏览器或终端执行
curl http://admin.sports.com.kg/api/sports_areas,检查是否能正常返回JSON数据 - 同步测试Swagger地址:如果Swagger页面也无法访问,说明服务器可能下线、域名过期或IP变更,需联系API提供者确认服务状态
2. 补全网络权限配置
Android端
在android/app/src/main/AndroidManifest.xml中,确保添加互联网权限声明:
<uses-permission android:name="android.permission.INTERNET" />
iOS端
由于项目使用HTTP协议,iOS默认会拦截非HTTPS请求,需在ios/Runner/Info.plist中添加例外配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
如果API支持HTTPS,优先改用HTTPS地址,可避免上述配置
3. 完善代码异常处理
原代码未捕获网络请求异常,导致出现未处理崩溃。修改RemoteService类,添加错误捕获与资源自动管理:
import 'dart:async'; import 'dart:convert'; import 'package:untitled/models/post.dart'; import 'package:http/http.dart' as http; class RemoteService { Future<List<Result>?> getPosts() async { // 使用withClient自动管理客户端资源,避免内存泄漏 return await http.Client().withClient((client) async { try { var uri = Uri.parse('http://admin.sports.com.kg/api/sports_areas'); // 添加超时限制,防止无限等待 var response = await client.get(uri).timeout(const Duration(seconds: 10)); if (response.statusCode == 200) { final parsed = json.decode(response.body) as Map<String, dynamic>; return parsed['results'].map<Result>((e) => Result.fromJson(e)).toList(); } else { print('请求失败,状态码:${response.statusCode}'); return null; } } catch (e) { // 捕获DNS解析、连接超时等所有网络异常 print('网络请求错误:$e'); return null; } }); } }
4. 优化主页状态管理
在getData方法中,无论请求成功或失败,都要更新状态避免加载指示器持续显示:
void getData() async { _stadiums = await RemoteService().getPosts(); setState(() { isLoaded = true; }); // 可选:若_stadiums为null,可在UI中添加错误提示组件 }
额外优化建议
- 优先切换到HTTPS协议:HTTP存在安全风险,且在现代移动系统中限制较多,若API支持HTTPS,将地址改为
https://admin.sports.com.kg/api/sports_areas - 增加重试机制:针对临时网络波动,可添加有限次数的请求重试逻辑
内容的提问来源于stack exchange,提问作者Hazmatik
相关产品推荐
相关产品推荐

