试图在模式中使用获取和传递: no-cors
我可以通过Postman点击这个端点,http://catfacts-api.appspot.com/api/facts?number=99
,它返回JSON
。
此外,我正在使用create-react-app,希望避免设置任何服务器配置。
在我的客户端代码中,我试图使用fetch
来做同样的事情,但我得到了错误。
请求的资源上没有'Access-Control-Allow-Origin'头。 资源。Origin 'http://localhost:3000' 因此不允许 访问。如果一个不透明的响应符合你的需要,请将请求'的 模式为'no-cors',以便在禁用CORS的情况下获取资源。
因此,我正试图向我的Fetch传递一个对象,它将禁用CORS,像这样。
fetch('http://catfacts-api.appspot.com/api/facts?number=99', { mode: 'no-cors'})
.then(blob => blob.json())
.then(data => {
console.table(data);
return data;
})
.catch(e => {
console.log(e);
return e;
});
有趣的是,我得到的错误实际上是这个函数的一个语法错误。我不确定我的实际 "fetch "是否有问题,因为当我删除{ mode: 'no-cors' }对象,并提供一个不同的URL时,就能正常工作。
我也试过传入对象{ mode: 'opaque'}
,但这返回了上面的原始错误。
我相信我所需要做的就是禁用 CORS。我错过了什么?
101
3
添加
mode: 'no-cors'
并不会神奇地使事情顺利进行。事实上,它使事情变得更糟,因为它的一个作用是告诉浏览器,"阻止我的前端JavaScript代码在任何情况下查看响应体和头文件的内容。"当然这几乎不是你想要的。 对于来自前端JavaScript的跨源请求,浏览器默认会阻止前端代码对资源的跨源访问。如果一个网站在其响应中发送Access-Control-Allow-Origin
,那么浏览器就会放松对它的封锁,允许你的代码访问响应。 但是,如果一个网站在其响应中没有发送Access-Control-Allow-Origin
头,你的前端代码就没有办法直接访问该网站的响应。特别是,你不能通过指定mode: 'no-cors'
来解决这个问题(事实上这将*确保你的前端代码不能访问响应内容)。 然而,有一件事会起作用,那就是如果你通过[一个 CORS 代理][1]发送你的请求,就像这样。注意:如果你去尝试使用https://cors-anywhere.herokuapp.com时,发现它已经停机了,你也可以轻松地在2-3分钟内将自己的代理部署到Heroku,只需5个命令。
运行这些命令后,你就会有自己的CORS Anywhere服务器在运行,例如,https://cryptic-headland-94862.herokuapp.com/。因此,不要在你的请求URL前加上`https://cors-anywhere.herokuapp.com`,而是用你自己的实例的URL前缀;例如,https://cryptic-headland-94862.herokuapp.com/https://example.com。
我的解决方案是直接在服务器端进行操作
我使用C#的
WebClient
库来获取数据(在我的例子中是图像数据)并将其送回给客户端。在你选择的服务器端语言中,可能也有非常类似的东西。你可以根据自己的使用情况进行调整。主要的一点是
client.DownloadData()
在没有任何CORS错误的情况下工作。通常情况下,CORS问题只发生在网站之间,因此,从你的服务器发出'跨网站'请求是可以的。那么React的获取调用就很简单了。
非常简单的解决方案(2分钟配置)是使用
npm
的local-ssl-proxy包。使用方法非常简单:。 1.安装该软件包。
npm install -g local-ssl-proxy
2.当运行你的
local-server
时,用local-ssl-proxy --source 9001 --target 9000
P.S:将
--target 9000
替换为-- "你的端口的数字"
,--source 9001
替换为--source "你的端口的数字+1"
。