React Native fetch()仅在Android端出现网络请求失败问题求助
应用已稳定运行2年,昨日傍晚6点左右所有Android设备(测试机+用户设备)均无法通过应用内fetch请求访问我方HTTPS服务器
https://xxxxxx.com,但同一设备可正常请求https://google.com,且Chrome/Firefox能正常打开我方域名。期间未修改/推送代码,服务器无配置变更。fetch请求逻辑如下:
async function Request_Async(data = {}, url = Config.SERVER_URL, method = 'POST', headers = defaultHeaders) { let status = null; let content = null; const header = { method: method, headers: headers, body: JSON.stringify(data) }; try { const request = await fetch(url, header); status = request.status; if (request.status === 200) { content = await request.json(); } else { content = { error: request.statusText }; } } catch (err) { status = 1; content = { error: err }; } return new ReqResponse(status, content); }
排查与解决步骤
检查Android网络安全配置
安卓9+默认限制明文流量,但HTTPS场景下可能因服务器证书链不完整(如中间证书过期)触发拦截。临时添加网络安全配置文件android/app/src/main/res/xml/network_security_config.xml:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">xxxxxx.com</domain> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </domain-config> </network-security-config>然后在
AndroidManifest.xml的<application>标签添加android:networkSecurityConfig="@xml/network_security_config"。若生效,说明是证书信任问题,需检查服务器证书链完整性。排查请求Header异常
检查defaultHeaders是否包含安卓系统或服务器WAF拦截的字段,比如自定义Header格式错误、User-Agent特征被拦截。临时简化Header测试:const defaultHeaders = { 'Content-Type': 'application/json', 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36' };验证DNS解析问题
React Native的fetch依赖系统DNS,而浏览器可能使用独立缓存。可尝试:- 将代码中的域名替换为服务器IP测试,若成功则是DNS解析异常,需检查域名DNS记录的TTL或解析配置
- 在设备上手动切换DNS为8.8.8.8后重试
排查WAF/CDN自动规则更新
即使服务器未变更,CDN或WAF可能自动更新拦截规则,识别并拦截了React Native的请求特征。用Charles抓包对比应用内请求与浏览器请求的差异(请求头、方法、Body格式等),调整请求参数匹配浏览器特征。清除fetch缓存
安卓端fetch基于OkHttp,可能因缓存过期导致请求失败。在请求配置中添加缓存控制:const header = { method: method, headers: { ...headers, 'Cache-Control': 'no-cache' }, body: JSON.stringify(data), cache: 'no-store' };同时清除应用的缓存和数据后重试。
抓包分析请求细节
使用Charles或Wireshark抓包,重点查看:- TLS握手是否成功,是否出现证书错误
- 请求是否发送至目标服务器,服务器是否返回响应
- 是否存在中间代理、防火墙拦截请求
内容的提问来源于stack exchange,提问作者Madar

