无法在React Native中获取或向http URL发送XHR请求(但https和http:// localhost工作正常)

时间:2018-01-03 05:14:13

标签: react-native

我尝试在React Native中向远程服务器发出请求,但总是得到TypeError: Network request failed;我尝试了不同的URL,发现如果我向http://rap2api.taobao.org/app/mock/3008/GET/api/creations之类的某个http网址发出请求,它总是失败; 如果我向https://facebook.github.io/react-native/movies.json之类的某个https网址发出请求,它会起作用; 如果我向http://localhost:3002/list这样的http localhost URL发出请求,它也可以。

componentDidMount() {
  console.log("_fetchData");
  this._fetchData()
}
_fetchData = () => {
      fetch('http://rap2api.taobao.org/app/mock/3008/GET/api/creations')
        .then((response) => response.json())
        .then((responseJson) => {
          console.log('responseJson',responseJson)
        })
        .catch((error) => {
          console.error(error);
        });
    
}

我在线检查了很多参考文献,并猜测它是关于Info.plist doc中的设置。我试着做一些修改,如:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>localhost</key>
    <dict>
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
    <key>rap2api.taobao.org</key>
    <dict>
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <key>NSIncludesSubdomains</key>
      <true/>
    </dict>
  </dict>
</dict>

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

但是,它们都不起作用,在向http URL请求时仍然会出现相同的错误。我确信API很好,因为我在Web应用程序上尝试并成功获得响应。有什么问题?

1 个答案:

答案 0 :(得分:2)

来自https://facebook.github.io/react-native/docs/network.html

  

默认情况下,iOS会阻止任何未使用SSL加密的请求。如果需要从明文URL(以http开头的URL)获取,则首先需要添加App Transport Security异常。如果您提前知道需要访问哪些域,则为这些域添加例外更安全;如果直到运行时才知道域,则可以完全禁用ATS。但请注意,从2017年1月起,Apple的App Store审核将需要合理的理由来禁用ATS。有关详细信息,请参阅Apple的文档。

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

  

从iOS 10.0及更高版本以及macOS 10.12及更高版本开始,支持以下子项:
  NSAllowsArbitraryLoadsForMedia
  NSAllowsArbitraryLoadsInWebContent
  NSRequiresCertificateTransparency
  NSAllowsLocalNetworking
  注意:有两个“允许任意加载”键,它们使用不同的命名模式。注意使用...... ForMedia和...... InWebContent正确。

您可以尝试显式设置NSAllowsArbitraryLoadsForMedia和NSAllowsArbitraryLoadsInWebContent。

还要确保在Xcode中清理和重建项目,以便更新的plist设置包含在您的包中。