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来修改配置:
- 打开Android项目中的
MainApplication.java - 在
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
相关产品推荐
相关产品推荐

