Expo Go Android端API请求遇Network request failed问题求助
Expo Go安卓端「Network request failed」问题排查与解决(Web端正常)
根因分析
- 本地API地址不兼容:Web端用
localhost/127.0.0.1能直接访问本地API,但安卓真机/模拟器的localhost指向自身设备,无法访问电脑上的服务;模拟器虽有特殊映射地址,但真机不支持。 - Android明文HTTP限制:Android 9及以上系统默认禁止非HTTPS请求,Web端浏览器对本地HTTP请求有豁免,但Expo Go安卓端严格遵循系统规则,导致HTTP请求被拦截。
- 电脑防火墙拦截:电脑防火墙可能阻止了局域网设备访问API端口,本地Web访问不受影响,但跨设备请求被阻断。
- 代理/VPN干扰:设备上的代理或VPN改变了网络路由,Expo Go的请求无法正常到达API服务器,而Web端可能使用了系统代理以外的配置。
- API服务器访问规则:部分API会根据
User-Agent、来源IP做限制,Expo Go安卓端的请求头与Web端不同,可能被服务器判定为非法请求。
解决方案
1. 替换API访问地址
- 本地运行API时,把请求地址从
localhost/127.0.0.1换成电脑的局域网IP(Windows用ipconfig、Mac/Linux用ifconfig查看),比如http://192.168.3.5:8080/api/login。 - 安卓模拟器可临时用
10.0.2.2(对应电脑的localhost),但真机无法使用该地址。
2. 开发环境允许HTTP明文请求
在app.json或app.config.js中配置安卓网络安全规则,允许指定域名的HTTP请求:
{ "expo": { "android": { "networkSecurityConfig": { "domainConfigs": [ { "domain": "你的API域名或局域网IP", "cleartextTrafficPermitted": true } ] } } } }
注意:生产环境必须使用HTTPS,切勿保留此配置。
3. 调整电脑防火墙设置
- 临时关闭电脑防火墙测试,若请求正常,再添加端口放行规则(允许API使用的端口接收局域网访问)。
- 确认API服务监听
0.0.0.0而非仅localhost,确保局域网设备能访问(多数框架默认配置,但需核实)。
4. 关闭代理与VPN
- 关闭设备上的代理和VPN,让Expo Go使用原生网络连接。
- 若必须用代理,在Expo开发者菜单(摇设备或按Ctrl+M)的「Settings」->「Proxy」中配置对应代理信息。
5. 检查API服务器规则
- 查看API服务器的访问日志,确认安卓设备的请求是否被拦截,排查
User-Agent、IP白名单等限制。 - 临时移除限制规则测试,若请求正常,再针对性调整规则(比如添加Expo Go的
User-Agent到白名单)。
6. 调试请求细节
在代码中添加详细错误日志,或用Charles等工具抓包,定位具体失败原因:
async function handleLogin() { try { const response = await fetch('你的API地址', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: 'xxx', password: 'xxx' }) }); // 处理响应 } catch (error) { console.error('请求失败详情:', error.message); console.error('错误栈:', error.stack); } }
内容的提问来源于stack exchange,提问作者DEXProject
相关产品推荐
相关产品推荐

