You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native fetch()仅在Android端出现网络请求失败问题求助

React Native安卓端突发无法访问自有HTTPS服务器(无代码/服务器变更)

应用已稳定运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:56:02