Flutter项目调用API遭遇SocketException连接拒绝问题求助
你在使用早期Flutter版本做跨平台网络请求时遇到了连接拒绝的问题,既然已经确认了Android的网络权限,那我们可以从以下几个方向排查和修复:
1. 检查baseUrl的正确性
你的代码里用baseUrl构造请求URI,首先要确认这个常量的值是准确的jsonplaceholder.typicode.com——不要带https://前缀(Uri.https已经指定了协议),也不要在末尾加斜杠,否则会生成类似https://jsonplaceholder.typicode.com//users的错误URL,直接导致连接失败。
比如你的constants.dart里应该是:
const String baseUrl = 'jsonplaceholder.typicode.com';
2. 配置iOS的ATS(App Transport Security)
在较老的iOS版本或Flutter版本中,ATS可能会严格限制HTTPS连接的安全性(哪怕目标是合法的HTTPS地址)。你需要在iOS项目的Info.plist文件中添加ATS例外配置:
打开ios/Runner/Info.plist,添加以下内容:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
注:这是测试场景的快速解决方法,正式发布时建议针对特定域名配置更严格的ATS规则。
3. 排查代理或网络环境问题
如果你的设备/模拟器处于代理环境下(比如电脑开了VPN、Charles等抓包工具),可能会导致Flutter的HttpClient无法正常连接目标服务器。试试关闭代理工具,或者切换到手机自身的移动网络测试请求。
如果需要保留代理,可以给HttpClient手动配置代理:
httpClient.findProxy = (uri) { return "PROXY your-proxy-ip:port"; };
4. 改用官方http包替代原生HttpClient
Flutter早期版本的HttpClient可能存在兼容性问题,换成官方维护的http包会更稳定。步骤如下:
- 在
pubspec.yaml中添加依赖:dependencies: http: ^0.12.0+2 # 适配Flutter 0.3.2的版本,可根据实际调整 - 修改你的请求代码:
import 'package:http/http.dart' as http; import 'dart:convert'; Future<List<User>> retrieve() async { final response = await http.get('https://jsonplaceholder.typicode.com/users'); if (response.statusCode == 200) { List userMap = json.decode(response.body); return userMap.map((jsonUser) => User.fromJson(jsonUser)).toList(); } else { throw Exception('Failed to load users'); } }
5. 验证URL的可访问性
先在浏览器或终端用curl命令测试目标URL是否能正常返回数据:
curl https://jsonplaceholder.typicode.com/users
如果这个命令也失败,那可能是你的网络本身无法访问该域名,需要排查网络连通性;如果能正常返回,再回到Flutter代码中调试。
内容的提问来源于stack exchange,提问作者jaumard

