在android上反应本机获取网络请求失败

Posted

技术标签:

【中文标题】在android上反应本机获取网络请求失败【英文标题】:react native Fetch Network request failed on android 【发布时间】:2019-08-19 06:42:21 【问题描述】:

我正在尝试从 mocky 接收一些简单的 json。

React 原生获取函数:

getMemberDomainList = async (name) => 
  try 
    let response = await fetch('https://5c9cc9ed3be4e30014a7d287.mockapi.io/api/domain', 
      method: 'POST',
      headers: 
        Accept: 'application/json',
        'Content-Type': 'application/json',
      ,
    );
    let responseJson = await response.json();
    return responseJson;
   catch (error) 
    console.error(error);
  

我已经在 windows 上的 chrome 中测试了地址,它返回了预期的模拟数据。但是当在我的安卓手机上调用这个函数时,我得到了这个错误

来自远程调试器的错误

...\node_modules\react-native\Libraries\Renderer\oss\ReactNativeRenderer-dev.js:2348 TypeError: Network request failed
    at XMLHttpRequest.xhr.onerror (...\Libraries\Renderer\oss\ReactNativeRenderer-dev.js:4337)
    at XMLHttpRequest.dispatchEvent (...\Libraries\Renderer\oss\ReactNativeRenderer-dev.js:10760)
    at XMLHttpRequest.setReadyState (...\Libraries\Renderer\oss\ReactNativeRenderer-dev.js:10511)
    at XMLHttpRequest.__didCompleteResponse (...\Libraries\Renderer\oss\ReactNativeRenderer-dev.js:10343)
    at ...\Libraries\Renderer\oss\ReactNativeRenderer-dev.js:10449
    at RCTDeviceEventEmitter.emit (...\Libraries\Components\Drawerandroid\DrawerLayoutAndroid.android.js:11)
    at MessageQueue.__callFunction (...\Libraries\ART\ReactNativeART.js:362)
    at blob:http://localhost:8081/79251787-d190-4650-8040-23d091c08738:2334
    at MessageQueue.__guard (...\Libraries\ART\ReactNativeART.js:312)
    at MessageQueue.callFunctionReturnFlushedQueue (...\Libraries\ART\ReactNativeART.js:139)

我还在我的应用程序中运行一个 WebView,它指向一个 Web url,它可以完美加载,所以我确信手机具有互联网权限和访问权限等。

【问题讨论】:

可能是因为需要http ... https 在你的远程调试器中......这是什么console.error(error); print ? 远程调试器无法正常工作。但是关于 https 的好点,将尝试另一个模拟服务,看看是否可以解决它 切换到 https 模拟 api 似乎有所不同,至少堆栈跟踪看起来有点不同。虽然“网络请求失败”但同样的错误 您是否尝试过使用axios 执行相同的api 请求? 【参考方案1】:

在最新的 android 版本中,默认情况下不允许 http 请求。查看这篇文章以获取有关允许 http 请求的更多信息:How to allow all Network connection types HTTP and HTTPS in Android (9) Pie?

【讨论】:

【参考方案2】:

无法让 mockapi.io 工作。但是在使用以下服务时,错误不会持续存在:

https://jsonplaceholder.typicode.com/todos/1

毕竟可能不是 android 或 react native 相关的问题。邮递员中的 mockapi.io 也有问题,尽管它在 chrome 中运行良好。

【讨论】:

【参考方案3】:

如果您使用的是模拟器,请使用浏览器在此模拟中检查互联网是否正常工作。如果不检查这个:Android emulator not able to access the internet

我在模拟器中也遇到过这个问题,但是当我生成发布应用程序并安装在真实设备(andoid 9)中时,它可以正常工作。

【讨论】:

是的 dev/prod build 会影响诸如互联网访问或允许的协议之类的事情。在我的情况下,我能够获取到 jsonplaceholder.typicode.com 很好地排除了我无法在模拟器上连接到互联网的想法。【参考方案4】:

请检查后端响应状态。

如果后端使用 205 状态发送内容 - 205 RESET CONTENT

Android 系统将其识别为错误 - HTTP 205 had non-zero Content-Length: 25

您可以在邮递员上查看状态码。 因此,在这种情况下,应该在后端修复错误。 它应该发送带有 200 状态码的内容。

【讨论】:

以上是关于在android上反应本机获取网络请求失败的主要内容,如果未能解决你的问题,请参考以下文章

在 React native + expo 中获取抛出网络请求失败

使用阿波罗客户端上传图像时获取网络请求失败反应原生android

未处理的承诺拒绝:TypeError:网络请求在expo react native 中失败

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

添加正文时在 POST 请求中反应本机网络错误

React Native:获取请求失败并出现错误 - TypeError:网络请求失败(...)