当我使用react-native init (RN版本0.29.1)创建一个全新的项目,并在渲染方法中获取公共facebook演示电影API时,它抛出了一个网络请求失败。有一个非常无用的堆栈跟踪,我不能调试网络请求在chrome控制台。这是我发送的fetch:

fetch('http://facebook.github.io/react-native/movies.json')
      .then((response) => response.json())
      .then((responseJson) => {
        return responseJson.movies;
      })
      .catch((error) => {
        console.error(error);
      });

当前回答

为了找到根源问题,我使用XMLHttpRequest而不是获取,并在发送请求后抛出一个异常的消息,告诉实际问题HTTP_1_1_REQUIRED。

显然,react本机(在我的情况下v0.59)只支持http/1.1,然后我在web服务器上禁用了http/2。

如果你的网络服务器是IIS,看看这个问题的答案

希望这能有所帮助。

其他回答

我使用localhost作为地址,这显然是错误的。在将其替换为服务器的IP地址(在仿真器所在的网络中)后,它可以完美地工作。

Edit

在Android Emulator中,开发机地址为10.0.2.2。更多解释在这里

对于Genymotion,地址是10.0.3.2。更多信息请点击这里

这里的问题是iOS默认不允许HTTP请求,只允许HTTPS。如果你想启用HTTP请求,添加到你的info.plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

我在Android 9上也遇到了同样的问题,因为“http”,问题通过添加Android:usesCleartextTraffic=“true”来解决 AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
  android:usesCleartextTraffic="true"
 .......>
 .......
</application>

Android用户:

Replace localhosts to a Lan IP addresses because when you run the project on an Android device, localhost is pointing to the Android device, instead of your computer, example: change http://localost to http://192.168.1.123 If your request URL is HTTPS and your Android device is under a proxy, assume you have installed User-added CA(like burp suite's CA or Charles's CA) in your Android device, make sure your Android version is below Nougat(7.0), because: Changes to Trusted Certificate Authorities in Android Nougat User-added CAs Protection of all application data is a key goal of the Android application sandbox. Android Nougat changes how applications interact with user- and admin-supplied CAs. By default, apps that target API level 24 will—by design—not honor such CAs unless the app explicitly opts in. This safe-by-default setting reduces application attack surface and encourages consistent handling of network and file-based application data.

为了找到根源问题,我使用XMLHttpRequest而不是获取,并在发送请求后抛出一个异常的消息,告诉实际问题HTTP_1_1_REQUIRED。

显然,react本机(在我的情况下v0.59)只支持http/1.1,然后我在web服务器上禁用了http/2。

如果你的网络服务器是IIS,看看这个问题的答案

希望这能有所帮助。