React Native fetch() 在 Android 7 上抛出“网络请求失败”,但在 Android 6 上运行良好

Posted

技术标签:

【中文标题】React Native fetch() 在 Android 7 上抛出“网络请求失败”,但在 Android 6 上运行良好【英文标题】:React Native fetch() throws 'Network request failed' on Android 7, but works fine on Android 6 【发布时间】:2017-12-23 12:47:49 【问题描述】:

我发现 (question) 获取请求在 android SDK 平台 23 (Android 6) 上成功结束,但在 Android SDK 平台 24 (Android 7) 上出现错误“网络请求失败”:

try 
   let res = await fetch('https://pricesea.ru/api/auth/login', 
     method: 'POST',
     credentials: 'include',
     headers: new Headers('Accept': 'application/json', 'Content-type': 'application/x-www-form-urlencoded'),
     body: `username=$this.state.username&password=$this.state.password`
   );

   if (res.ok) 
     ...
   
 catch (e) 
   console.log(e);

错误:

TypeError: Network request failed
at XMLHttpRequest.xhr.onerror (fetch.js:441)
at XMLHttpRequest.dispatchEvent (event-target.js:172)
at XMLHttpRequest.setReadyState (XMLHttpRequest.js:546)
at XMLHttpRequest.__didCompleteResponse (XMLHttpRequest.js:381)
at XMLHttpRequest.js:485
at RCTDeviceEventEmitter.emit (EventEmitter.js:181)
at MessageQueue.__callFunction (MessageQueue.js:260)
at MessageQueue.js:101
at MessageQueue.__guard (MessageQueue.js:228)
at MessageQueue.callFunctionReturnFlushedQueue (MessageQueue.js:100)

我正在使用 RN 0.46.3。

这可能是什么原因?

编辑:我已经测试了从 22 到 26 的 API 版本,问题只出在 API 24 (Android 7.0) 上。在其他 API 版本上,请求成功结束。

编辑 2: Github RN 问题:https://github.com/facebook/react-native/issues/15100

【问题讨论】:

【参考方案1】:

这是 Android 7.0 上的一个错误,如 described here。 Vicky Chijwani 提出的解决方法:

将您的服务器配置为使用椭圆曲线 prime256v1。为了 例如,在 nginx 1.10 中,您可以通过设置 ssl_ecdh_curve 素数256v1;

【讨论】:

这工作得很好,尽管牺牲了一点安全性。由于 Nginx 1.11.0 和 OpenSSL 1.0.2 可以指定多个密码ssl_ecdh_curve prime256v1:secp384r1; - 请参阅nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ecdh_curve

以上是关于React Native fetch() 在 Android 7 上抛出“网络请求失败”,但在 Android 6 上运行良好的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义的 React-Native Firebase React-native-fetch-blob 的属性“DocumentDir”

如何从 fetch 中获取 JSON 数据(react-native)

fetch() 在 react-native (iOS) 上做 GET 而不是 POST

React Native fetch .then 不执行代码,具体取决于内容

react-native android fetch json停止工作

使用React Native中的Fetch授权标头