Expo React Native安卓设备连接MySQL失败的URL配置问题
问题原因
你代码里配置的接口地址https://localhost/api/insert.php,在web端运行时指向启动服务的笔记本本身,所以可以正常连通写入数据;但应用运行在安卓设备上时,localhost指向的是安卓设备自身的回环地址,根本访问不到笔记本上部署的后端服务,这是数据无法写入的核心原因,另外你代码里还有几处会直接导致请求失败的写法问题,按下面步骤修复即可。
修复步骤
- 替换接口地址
先把安卓设备和笔记本连接到同一个WiFi(同一局域网),查询笔记本在当前局域网下的IPv4地址:Windows系统打开命令提示符执行ipconfig,在当前连接的网络适配器下找IPv4地址,一般为192.168.x.x格式;Mac系统可以在终端执行ifconfig或者直接在系统设置-网络页查看。
拿到IP后把原代码里的接口地址替换为http://查询到的局域网IP/api/insert.php,比如笔记本IP是192.168.3.15,地址就写http://192.168.3.15/api/insert.php。补充:如果你用的是安卓官方模拟器,不需要查局域网IP,直接把地址写为
http://10.0.2.2/api/insert.php即可访问宿主机的本地服务;如果是第三方模拟器(比如雷电、夜神),对应宿主机地址一般是http://10.0.3.2。调试阶段不要用自签名HTTPS证书,安卓默认会拦截不受信任的HTTPS证书,直接用HTTP地址调试即可。 - 开放安卓明文请求权限
安卓9及以上版本默认禁止应用发送HTTP明文请求,需要打开React Native项目下的android/app/src/main/AndroidManifest.xml文件,在<application>标签上添加属性android:usesCleartextTraffic="true",保存后重新打包安装应用即可。 - 修正fetch请求语法
你当前写的fetch调用链式逻辑、try/catch写法都是错误的,另外mode:'no-cors'是浏览器端专属配置,React Native环境不支持;Access-Control-Allow-*开头的跨域头是后端返回时配置的,前端请求头里携带这些字段没有任何作用,反而可能触发异常,直接删除即可。把原Register方法替换为下面的正确写法:Register = () => { let userid = this.state.userid; // 替换为你自己的实际接口地址 let InsertAPIURL = "http://你的笔记本局域网IP/api/insert.php"; let headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', } let Data = { userid: userid, }; fetch(InsertAPIURL, { method: 'POST', headers: headers, body: JSON.stringify(Data) }) .then(response => response.json()) .then(response => { alert(response[0].Message); }) .catch(error => { alert("Error"+error); }) } - 检查本地服务防火墙配置
打开笔记本的防火墙设置,确认当前部署PHP服务的端口(一般是80端口)没有被拦截入站请求;如果用的是PHPStudy等集成环境,确认服务没有绑定为仅localhost可访问,改为允许所有IP访问。
内容的提问来源于stack exchange,提问作者d.chan
相关产品推荐
相关产品推荐

