[英]Fetch: I see the response in the DevTools but Fetch still gives me an "Access-Control-Allow-Origin" issue for GET
所以我有一个关于fetch
和Access-Control-Allow-Origin
。
我尝试获取一些这样的网站:
fetch('https://localhost/.../api/json')
.then(blob => blob.json())
.then(data => console.log("data:", data))
.catch(err => console.log("err: ", err));
所以在 Chrome 网络标签中,我看到显然没有问题。 但是,在 JavaScript 代码中,我遇到了CORS
问题。 这怎么可能呢? 看:
我尝试添加mode: 'cors'
它没有帮助。 我尝试添加mode: 'no-cors'
是的,它通过了,但在这种情况下我无法阅读答案,我得到了Unexpected end of input
无论如何'blob'
变量是空的。
如果我使用Postman
或Curl
在没有任何选项或标题的情况下执行相同的 GET 请求,它就像一个魅力,我会得到我的回应。
你有什么主意吗? 提前致谢
编辑:由于它正在处理Postmann
和Curl
并且因为我可以在 Chrome Debugger 中看到响应,我认为它不是另一个问题的重复,其中请求明确转到不允许的外部 URL从其他地方访问。 对?
Edit2:它可能必须这样做地址: https://localhost
是自签名的,因此没有有效的证书? 在curl
我必须添加--insecure
标志。
正如 TJ Crowder 所指出的,这在浏览器中是不可能做到的。 查看相关资源:
但是,不要绝望! 有一个解决方法:
我们将使用调用cURL
的节点服务器来绕过限制:
您将需要带有 npm 的 nodejs。
npm init
和npm i -S express
api.js
文件。 使用以下代码: const https = require("https");
const express = require('express');
const app = express();
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
app.get('/', function (req, res) {
const exec = require('child_process').exec;
exec('curl ' + req.query.url + ' --insecure', function (error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
res.json(stdout);
if (error !== null) {
console.log('exec error: ' + error);
}
});
});
app.listen(3000, function () { console.log('listening on port 3000!'); });
node api.js
运行服务器localhost:3000
发出请求,并在查询参数中添加要向其发出get
请求的 url。 例子: fetch('http://localhost:3000/?url=https://HOST/.../api/json')
.then(blob => blob.json())
.then(data => console.log("data:", data))
.catch(err => console.log("err: ", err));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.