React Native fetch()networking请求失败

当我使用react-native init (RN版本0.29.1)创build一个全新的项目,并在渲染方法中将提取放入公共Facebook演示电影API时,会引发Network Request Failed 。 有一个非常无用的堆栈跟踪,我不能在Chrome控制台debuggingnetworking请求。 这是我发送的提取:

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

这里的问题是iOS默认不允许http请求,只有https。 如果您想启用http请求,请将其添加到您的info.plist中:

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

不build议允许http的所有域。 只为必要的领域做一个例外。

来源: 在iOS 9和OSX 10.11中configurationApp Transport安全例外

将以下内容添加到您应用的info.plist文件中:

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>yourserver.com</key> <dict> <!--Include to allow subdomains--> <key>NSIncludesSubdomains</key> <true/> <!--Include to allow HTTP requests--> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> <!--Include to specify minimum TLS version--> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> </dict> </dict> </dict> 

问题可能出现在服务器configuration中。

Android 7.0有一个在这里描述的错误。 Vicky Chijwani提出的解决方法:

configuration您的服务器使用椭圆曲线prime256v1。 例如,在Nginx 1.10中,你可以通过设置ssl_ecdh_curve prime256v1来实现;

只要你有取得变化….

 fetch('http://facebook.github.io/react-native/movies.json') .then((response) => response.json()) .then((responseJson) => { /*return responseJson.movies; */ alert("result:"+JSON.stringify(responseJson)) this.setState({ dataSource:this.state.dataSource.cloneWithRows(responseJson) }) }).catch((error) => { console.error(error); }); 

对于Android,您可能错过了在AndroidManifest.xml中添加权限需要添加以下权限。

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

React Native Docs为此提供了答案。

Apple已经阻止隐式明文HTTP资源加载。 所以我们需要添加以下我们的项目的Info.plist(或等效)文件。

 <key>NSExceptionDomains</key> <dict> <key>localhost</key> <dict> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> 

React Native Docs – >与现有应用程序集成 – > App Transport Security