Reactjs 获取API不适用于localhost/127.0.0.1
作为背景,我在远程EC2 Ubuntu实例上安装了一个react应用程序。同一服务器还运行一个Go应用程序,监听端口8080(该端口已从安全设置向所有人打开) 我正在尝试从React应用程序使用Fetch API发出请求,如下所示:Reactjs 获取API不适用于localhost/127.0.0.1,reactjs,amazon-ec2,fetch,Reactjs,Amazon Ec2,Fetch,作为背景,我在远程EC2 Ubuntu实例上安装了一个react应用程序。同一服务器还运行一个Go应用程序,监听端口8080(该端口已从安全设置向所有人打开) 我正在尝试从React应用程序使用Fetch API发出请求,如下所示: var bearer = 'Bearer ...' return fetch('http://localhost:8080/home', { headers: new Headers({ 'Authorization': bearer }) })
var bearer = 'Bearer ...'
return fetch('http://localhost:8080/home', {
headers: new Headers({
'Authorization': bearer
})
})
在控制台中,从Chrome和Firefox,我得到:
类型错误:尝试获取资源时出现NetworkError
当我用127.0.0.1
替换localhost
时也是如此
但是,使用EC2实例的外部IP是可行的(并触发CORS请求-由于“授权”头-由服务器顺利处理)
在后一种情况下,我还可以看到服务器记录两个选项和GET的传入请求(在前一种情况下,两种方法都不存在日志)
我还尝试了从EC2机器到localhost
的卷曲,请求有效地通过了,这让我认为使用fetchAPI根本不会触发请求
如有任何建议,将不胜感激。如果我做错了什么,请给我指出正确的方向。当您编写
localhost
时,它会调用您的(localhost)计算机(存在浏览器),因为js
代码正在您的浏览器中运行
您应该为API端点创建一个域/子域,并使用它而不是localhost,或者继续使用硬编码的IP地址
您还应该只允许您的前端网站域位于后端允许的来源中。例如,您的网站可以是
www.example.com
,后端url可以是www.api.example.com
。您应该只允许www.example.com
作为origin
,它可以通过www.api.example.com
提供服务。您需要在后端对此进行配置。如果您试图向localhost发送请求,并且您正在localhost上托管服务器,则不需要指定url,只需告诉fetch()
您的路径即可
例如,我的api端点是http://localhost:8082/api/config
,然后我将执行获取('/api/config')
这里有一个到
fetch
方法的链接,我刚才遇到了同样的问题。我通过添加“代理”成功地实现了这一点:http://localhost:4000“
到package.json
然后您可以编写请求,比如fetch('/api/todos')
他们解释得很好。您在浏览器中使用哪个url来打开页面(执行实际的获取请求)?我使用的是EC2实例的外部IP地址(端口80),即成功获取请求所指向的IP地址。谢谢,这很有意义。虽然这可能更适合我想问的另一个问题,但如果可能的话,您如何在本地开发机器(使用localhost)和远程生产机器(不能使用localhost)之间保持相同的配置呢?我使用两种环境。基本上保留一个
webkpack.config.js
和webpack.config.prod.js
。并在webpack中使用DefinePlugin定义您的后端子域。在prod
config中,使用子域,在dev config中,使用localhost。另外,我允许所有的源代码在我的后端开发模式。太好了!这正是我所希望的。这不是答案。问题是如何使它与本地主机配合使用以进行本地开发,而不是如何以最明显的方式规避此问题。请记住重新启动服务器!