我有一个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快速开发。我非常感谢其他人可以就此问题提供的任何见解!
答案 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相比)。