使用Dio包调用本地API时出现Connection Timed Out问题求助
问题
使用Dio包调用朋友开发的本地API的POST接口,最初遇到SocketException,将127.0.0.1替换为当前IP并执行php artisan serve --host 192.168.1.105后解决该异常,但随后出现Connection Timed Out错误。即便延长连接超时时长也无法解决问题,Dio工具类代码如下:
import 'package:dio/dio.dart'; class DioHelper { static Dio? dio; static init() { dio = Dio(BaseOptions( baseUrl: "http://192.168.1.105:8000/api/", responseType: ResponseType.json, receiveTimeout: 30000, connectTimeout: 500000, followRedirects: false, receiveDataWhenStatusError: true, )); } static Future<Response> post( {required String url, Map<String, dynamic>? query, Map<String, dynamic>? body}) async { return await dio!.post(url, queryParameters: query, data: body); } }
错误原因分析
- 设备不在同一局域网:发起请求的设备(手机/模拟器)与运行Laravel服务的电脑未连接同一WiFi,IP网段不匹配,导致请求无法抵达目标主机。
- Laravel服务监听地址异常:执行
php artisan serve时,可能绑定的IP/端口与请求地址不符,比如端口不是8000,或主机IP输入错误,导致服务无法接收请求。 - 防火墙拦截:电脑系统防火墙(Windows Defender、Mac防火墙)阻止了8000端口的外部连接请求。
- 模拟器网络配置问题:安卓模拟器默认网络模式可能无法直接访问局域网IP,导致请求超时。
可行解决方案
1. 确认设备处于同一局域网
检查电脑和请求设备的WiFi连接状态,确保两者IP处于同一网段(如均为192.168.1.x)。
2. 验证Laravel服务监听状态
- 执行
php artisan serve --host 192.168.1.105 --port 8000明确指定IP和端口,启动后确认终端输出的服务地址为http://192.168.1.105:8000。 - 在电脑浏览器中访问
http://192.168.1.105:8000/api/[你的接口路径],确认服务可正常响应,排除服务本身故障。
3. 调整防火墙设置
临时关闭电脑防火墙后重新测试请求,若恢复正常,说明是防火墙拦截,需在防火墙规则中添加允许8000端口入站的权限。
4. 修正模拟器网络配置(安卓模拟器)
- 若使用Android Studio模拟器,可将网络模式改为桥接模式;
- 或执行命令
adb reverse tcp:8000 tcp:8000,将模拟器8000端口映射到电脑8000端口,此时请求地址可改为http://10.0.2.2:8000/api/。
5. 完善Dio工具类
- 确保
DioHelper.init()在应用启动时调用(如main函数中),避免dio实例未初始化; - 添加异常捕获打印详细错误信息,便于排查:
static Future<Response> post( {required String url, Map<String, dynamic>? query, Map<String, dynamic>? body}) async { try { return await dio!.post(url, queryParameters: query, data: body); } catch (e) { print("请求错误详情: $e"); rethrow; } }
内容的提问来源于stack exchange,提问作者hamz
相关产品推荐
相关产品推荐

