React Native - 在获取非https url时出现“网络请求失败”

5

在将SDK版本更新到26后,获取非https的URL会失败。这只会发生在生产环境中,开发模式下一切正常。以下是相关代码:

fetch('http://something.com/').then(
  r => {},
  e => console.error(e));

这会在logcat中产生以下内容:
08-12 19:08:47.555 14586 14623 E ReactNativeJS: [TypeError: Network request failed]

这是我的android/app/build.gradle文件:

android {
    compileSdkVersion 23
    buildToolsVersion "27.0.3"

    defaultConfig {
        ...

        minSdkVersion 16
        targetSdkVersion 26
        versionCode 28
        versionName "0.1.0"
    }

...
}

1
Android 9.0+默认禁止明文流量(请参见“默认启用网络传输层安全性”),适用于targetSdkVersion为28或更高版本的应用程序。理想情况下,您应该切换到使用https方案访问站点。 - CommonsWare
@CommonsWare 对不起,我目前的 SDK 版本是 26。我正在 Android 7.0 上进行测试。 - Olim Saidov
我已经包含了build.gradle文件的内容。 - Olim Saidov
1
我相信设备默认会阻止非安全的URL。你应该寻找一种方法在本地配置中访问非安全的网络内容。 - Jimi Pajala
3个回答

1

尝试使用其他的HTTP客户端,例如 axios


0

你可能需要在你的AndroidManifest.xml文件中添加INTERNET权限。

像这样:

<manifest xlmns:android...>
 ...
 <uses-permission android:name="android.permission.INTERNET" />
 <application ...
</manifest>

另一个原因可能是您的请求头中包含 charset: utf-8。如果您ping非拉丁服务器,这可能会成为问题。在这种情况下,您的服务器管理员需要更新他所使用的 nginx(或其他用于Web服务的软件)设置以允许该标头。

最后一个可能的问题是虚拟路由器


我确实拥有android.permission.INTERNET权限。就像我说的,在开发运行中一切都正常。 - Olim Saidov

-2
问题在于,iOS 在模拟器中运行,而 Android 在模拟器中运行。 localhost 指向代码运行的环境。模拟器模拟真实设备,而模拟器只是模拟设备。 因此,在 Android 上,localhost 指向模拟的 Android 设备,而不是指向您的服务器所在的计算机。 解决方案是将 localhost 替换为您计算机的 IP 地址。

问题不在于连接本地主机。请先阅读问题。 - Olim Saidov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接