Flutter模拟器调用Win10本地localhost接口报错该如何解决?
问题原因说明
第一个连接拒绝报错是因为Android模拟器的localhost指向模拟器自身,而非你的Win10宿主电脑,修改为10.0.2.2(Android模拟器专门用于映射宿主电脑localhost的保留IP)是正确操作。
第二个格式错误说明请求已经成功发送到你的本地API服务,但服务端返回的不是预期的JSON格式数据,而是HTML格式的错误页面,因此JSON解析失败,按照以下步骤排查配置即可:
配置调整步骤
修改本地API的监听地址
绝大多数后端服务默认仅监听127.0.0.1(仅本机可访问),需修改为监听所有网卡地址。以常见的ASP.NET Core为例:- 打开项目下的
Properties/launchSettings.json - 将
applicationUrl中的localhost替换为0.0.0.0,示例:"applicationUrl": "http://0.0.0.0:51797;https://0.0.0.0:71797" - 重启API服务即可。
其他后端框架可自行搜索修改监听IP的配置方法,确保服务允许非本机IP访问。
- 打开项目下的
配置Windows防火墙放行端口
打开Windows Defender防火墙,添加一条入站规则,放行51797端口的TCP连接,避免模拟器的请求被系统防火墙拦截。配置后端服务允许跨域请求(CORS)
Flutter模拟器发送的请求来源和本地API的域名不一致,会触发后端的跨域拦截规则,多数后端默认会返回HTML格式的跨域错误页。你需要在后端服务中添加CORS配置,允许跨域请求,测试阶段可临时允许所有来源、所有请求头、所有方法的访问。检查Flutter端的请求头配置
确保你发送JSON请求时,主动添加了Content-Type: application/json请求头,示例代码(http包):var response = await http.post( Uri.parse('http://10.0.2.2:51797/test'), headers: {'Content-Type': 'application/json'}, body: jsonEncode(yourRequestBody), );缺少该请求头时,后端可能无法识别请求格式,返回错误页面。
可选排查方案
可将接口地址替换为你Win10电脑的局域网IP(可通过cmd执行ipconfig查看,格式一般为192.168.x.x),同时确保模拟器连接的WiFi和你的Win10电脑在同一局域网下,可排查是否是10.0.2.2的映射异常问题。
内容的提问来源于stack exchange,提问作者David

