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

React Native 0.44.0版本fetch请求失败问题求助(无需升级)

解决React Native 0.44.0中特定HTTPS请求失败的问题

我之前也碰到过类似的坑,RN 0.4x版本的网络层确实存在不少兼容性问题,尤其是和配置了较新TLS协议的服务器交互时。从你给出的TypeError: Network request failed报错,以及升级到0.55.0就恢复正常的情况来看,大概率是旧版本RN依赖的OkHttp客户端不支持服务器要求的TLS协议版本,或者证书验证逻辑存在兼容性bug。下面是几个不用升级整个RN就能解决的可行方案:

方案1:强制OkHttpClient启用TLS 1.2及以上版本

RN 0.44.0默认依赖的OkHttp版本比较旧(大概是3.4.x),默认没有启用TLS 1.2,而现在很多服务器已经要求使用这个版本的加密协议。你可以通过自定义OkHttpClient来修改配置:

  1. 打开Android项目中的MainApplication.java
  2. 在onCreate方法中添加以下代码替换默认网络客户端:
import com.facebook.react.modules.network.OkHttpClientProvider;
import com.facebook.react.modules.network.ReactCookieJarContainer;
import okhttp3.OkHttpClient;
import okhttp3.ConnectionSpec;
import okhttp3.TlsVersion;
import java.util.Arrays;

@Override
public void onCreate() {
  super.onCreate();
  // 自定义OkHttp配置,强制使用TLS 1.2/1.3
  OkHttpClient.Builder clientBuilder = OkHttpClientProvider.createClientBuilder();
  ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
      .tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_3)
      .build();
  clientBuilder.connectionSpecs(Arrays.asList(spec, ConnectionSpec.CLEARTEXT));
  OkHttpClientProvider.replaceOkHttpClient(clientBuilder.build());
}

方案2:临时跳过证书验证(仅测试环境使用!)

如果是服务器证书的问题(比如自签名证书、证书链不完整),可以临时跳过验证,但生产环境绝对不能这么做,会带来严重的安全风险:

同样在MainApplication.java的onCreate方法中修改:

import com.facebook.react.modules.network.OkHttpClientProvider;
import okhttp3.OkHttpClient;
import okhttp3.ssl.SSLContextBuilder;
import okhttp3.ssl.TrustAllManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;

@Override
public void onCreate() {
  super.onCreate();
  try {
    // 创建信任所有证书的TrustManager
    X509TrustManager trustAllManager = new X509TrustManager() {
      @Override
      public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}
      @Override
      public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}
      @Override
      public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[]{}; }
    };
    SSLContext sslContext = SSLContextBuilder.create()
        .loadTrustMaterial(null, (chain, authType) -> true)
        .build();
    // 修改OkHttpClient,跳过证书验证
    OkHttpClient.Builder clientBuilder = OkHttpClientProvider.createClientBuilder();
    clientBuilder.sslSocketFactory(sslContext.getSocketFactory(), trustAllManager);
    clientBuilder.hostnameVerifier((hostname, session) -> true);
    OkHttpClientProvider.replaceOkHttpClient(clientBuilder.build());
  } catch (Exception e) {
    e.printStackTrace();
  }
}

方案3:单独升级OkHttp依赖版本

如果上面的方案都不行,你可以尝试单独升级Android项目中的OkHttp版本,注意要选择和RN 0.44.0兼容的版本:

打开Android app模块下的build.gradle,修改OkHttp依赖:

dependencies {
  // 替换为兼容TLS 1.2的OkHttp版本
  compile 'com.squareup.okhttp3:okhttp:3.12.13'
  compile 'com.squareup.okhttp3:okhttp-urlconnection:3.12.13'
}

额外小提示:检查请求头完整性

虽然升级后请求正常,但你可以试试给fetch添加User-Agent头,有些服务器会对请求头做校验:

fetch(url, {
  method: 'GET',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'User-Agent': 'ReactNative/0.44.0' // 添加这个头试试
  }
})

建议先尝试方案1,这是最安全且覆盖场景最多的解决办法,大部分TLS版本不兼容的问题都能通过这个解决。如果还是不行,再考虑方案2(仅限测试)或者方案3。

内容的提问来源于stack exchange,提问作者Zeeshan Shamsuddeen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:17:16