React Native 0.66 Android端axios调用接口报Network request failed错误
问题引发原因
- 你通过Laravel Valet配置的
cms.test是仅Mac本地生效的自定义域名,Android设备/模拟器的DNS系统没有对应的解析记录,无法识别该域名指向的服务器地址,这是触发NETWORK ERROR的核心原因。 - 虽然你已经配置了
usesCleartextTraffic="true"放行http请求,但域名解析失败的优先级更高,所以该配置不生效。
解决方案
方案一:直接替换请求域名(优先选择,操作简单)
- 先查询Mac的局域网IP:打开终端执行命令
ifconfig | grep inet,找到形如192.168.x.xx的非127.0.0.1的IP地址。 - 修改axios的baseURL配置,将
http://cms.test/替换为http://你查到的Mac局域网IP/,如果Valet没有配置IP默认访问的项目,需要补全项目路径,示例:
// 假设你的Mac局域网IP为192.168.3.15,cms项目存放在park目录下的cms文件夹 axios.defaults.baseURL = 'http://192.168.3.15/cms/public/';
- 确保测试用的Android模拟器/真机和Mac连接同一个WiFi网络,即可正常发起请求。
方案二:配置Android设备hosts解析(适配需要保留test域名的场景)
如果不想修改代码里的域名,可给Android设备配置hosts规则:
- 确保你的Android模拟器已获取root权限,真机需要root后操作。
- 打开终端执行以下命令:
# 获取root权限 adb root # 重新挂载系统分区获取写入权限 adb remount # 拉取设备hosts文件到桌面 adb pull /system/etc/hosts ~/Desktop/hosts
- 打开桌面的hosts文件,新增一行记录:
你的Mac局域网IP cms.test,保存文件。 - 执行命令把修改后的hosts文件推回设备:
adb push ~/Desktop/hosts /system/etc/hosts
- 重启Android设备后即可用原
http://cms.test/域名正常请求接口。
额外注意项
你当前代码的catch逻辑存在问题,return false执行后后续的错误提示代码不会运行,建议调整顺序:
.catch(error => { console.log(error); // 先判断response是否存在,避免解析报错 if(error.response?.data?.errors) { const key = Object.keys(error.response.data.errors)[0]; setError(error.response.data.errors[key][0]); } return false; })
内容的提问来源于stack exchange,提问作者shazim ali
相关产品推荐
相关产品推荐

