CORS:使用react-native拒绝对localhost的http请求

时间:2017-03-14 20:04:47

标签: ios xcode http https react-native

我有一个Express.js服务器,支持在端口8080上运行的CORS标头,我正在尝试从iPhone 5上的React Native应用程序向该端口发出http请求,但是收到以下错误:

[Error: Request has been terminated
Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.]

请求如下所示:

import request from 'superagent'

const getMarkers = (url, callback) => {
  request
    .get(url)
    .set('Accept', 'application/json')
    .end(callback)
}

getMarkers('localhost:8080/markers, this.handleMarkers)

我的Express中间件看起来像这样:

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*')
  res.header('Access-Control-Allow-Headers',
    'Origin, X-Requested-With, Content-Type, Accept')
  next()
})

我允许任意负载'对于我的项目。

当我使用ios Simulator时,这些请求运行正常。此外,当我下载ngrok,在我的快速服务器目录中运行它们并使客户端请求到ngrok提供的https地址时,这些请求运行正常。

我的问题是:如何在不使用像ngrok这样的东西的情况下促进这些请求?如果可能的话,我希望能够仅使用http和localhost快速开发。我非常感谢其他人可以就此问题提供的任何见解!

2 个答案:

答案 0 :(得分:0)

我相信这是你的问题:

  

App Transport Security是一项安全功能,在iOS 9中添加,可拒绝所有未通过HTTPS发送的HTTP请求。这可能导致HTTP流量被阻止,包括开发人员React Native服务器。

     

默认情况下,在使用React Native CLI生成的项目中禁用ATS,以便于开发。您应该在构建应用程序之前重新启用ATS,方法是从ios /文件夹中的Info.plist文件中删除NSAllowsArbitraryLoads条目。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>**YOUR DOMAIN HERE**</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

答案 1 :(得分:0)

如果它是一个错误,这里有一些我发现有用的工作:

快递应用:
- 尝试明确添加http标头:"X-Requested-With": "XMLHttpRequest"
- 我有时需要将我的服务器设置为在IP 0.0.0.0而不是127.0.0.1

上运行

对于本地反应应用程序:
- 我有过使用127.0.0.1的经验,或者在发出请求时使用特定主机的名称(与使用localhost相比)。