为什么Flutter调用API报SocketException连接被拒但Postman、网页端可正常访问?
SocketException: Connection refused, errno = 111 属于TCP连接建立失败错误,请求还没到达HTTP协议处理层,因此你确认的请求头、请求体、Cookie参数正确不影响该问题的定位,按以下优先级排查:
1. 优先排查运行设备网络连通性
- 若使用Android模拟器调试:Android模拟器存在网络隔离,默认无法直接访问宿主机的10.0.0.0/8网段地址,你配置的10.0.0.25是宿主机IP的话,需将baseUrl改为模拟器默认宿主机映射地址
10.0.2.2,同时确认后端服务绑定的是0.0.0.0而非127.0.0.1,绑定回环地址的话仅宿主机自身可访问。 - 若使用真机调试:确保手机与后端服务所在设备连接同一WiFi,关闭路由器AP隔离功能,且手机可以通过浏览器直接访问API地址验证连通性。
2. 检查Android端网络权限配置
- 确认Flutter项目Android目录下的
AndroidManifest.xml已配置网络权限:
<!-- 必须添加的网络访问权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- 若你的API是HTTP明文协议,Android 9及以上系统默认禁止明文请求,需在
application标签中添加配置:
<application ... android:usesCleartextTraffic="true">
3. 核对Dio实例配置
- 检查你通过服务定位器注入的Dio实例的
baseUrl配置,确认端口、路径前缀与Postman调用的完全一致,未出现拼写错误。 - 确认Dio实例未配置无效的代理规则,若之前为了抓包配置过Fiddler/Charles代理,代理未开启时会触发连接拒绝错误。
- 建议补充Dio的超时配置:
BaseOptions options = BaseOptions( baseUrl: "你的API地址", connectTimeout: Duration(seconds: 10), receiveTimeout: Duration(seconds: 10), ); Dio dio = Dio(options);
4. 排查本地防火墙限制
临时关闭后端服务所在设备的防火墙、安全防护软件,再次尝试请求,确认是否为防火墙拦截了端口访问。
额外注意
你提供的响应模型代码存在命名不一致问题,类名是LoginResponsev3,但构造函数、序列化方法命名都是LoginResponse,接口连通后会触发序列化失败错误,需修正命名保持一致。
内容的提问来源于stack exchange,提问作者Dan Anderson
相关产品推荐
相关产品推荐

