我们使用 CPP 语言创建了一个 EXE 文件,并创建了一个像
http://localhost:5800/get-id/
这样的 API。当我在浏览器中打开时,返回完美的输出。
当我在 HTML > 脚本页面中使用
fetch
时,然后得到 No "Access-Control-Allow-Origin" header is present on the requested resource.
代码1:
fetch("http://localhost:5800/get-id/", {method: 'GET').then(function(response) {
console.log(response.text());
}).catch(function(error) {
console.log('Request failed', error)
});
经过研究,我添加了
mode: no-cors
错误丢失但得到空响应。
代码2:
fetch("http://localhost:5800/get-id/", {method: 'GET', mode: 'no-cors'}).then(function(response) {
console.log(response.text());
}).catch(function(error) {
console.log('Request failed', error)
});
如果我在任何检查控制台中使用
code2
,则会得到一个空主体,但是当我在浏览器中打开http://localhost:5800/get-id/
并尝试在控制台中点击code2
时,则会获得完美的参数。
这意味着,本地主机域工作正常,但是当它通过我的错误从任何域获取时。
正确的解决方案是什么?在C/CPP语言中我们如何允许cors?
奇怪:
CORS 是一个复杂的话题,我通常使用 CORS 中间件 在 Express 服务器的 Node.JS 中处理它(也许代码对解决这个问题很有用)。
它的目标是允许域
api-domain
上的API列出可以使用它的Web应用程序,例如您的应用程序位于webapp-domain
域上。
当应用程序调用
fetch('http://api-domain/get-id/')
到另一个域时,称为跨源调用。
所有浏览器都执行 CORS 预检这样的调用来检查津贴:
OPTIONS /get-id/
Access-Control-Request-Method: GET
Access-Control-Request-Headers: origin, x-requested-with
Origin: http://webapp-domain
(请注意,这是对 API 的 OPTION 请求,而不是 GET)
并且响应应将
webapp-domain
列为允许(并指定允许哪些 HTTP 方法)
HTTP/1.1 204 No Content
Connection: keep-alive
Access-Control-Allow-Origin: http://webapp-domain
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 86400
成功完成这样的预检调用后,浏览器将继续
fetch
,例如,它将向 http://api-domain/get-id/
发送 GET 请求
附注
跳过 CORS 的方法之一是在
webapp-domain
中设置 HTTP 代理,该代理将在服务器端调用 api-domain
,并且不受 CORS 限制。有关详细信息,请参阅this答案。
HTTP/1.1 204 无内容 连接:保持活动状态 访问控制允许来源:http://webapp-domain 访问控制允许方法:POST、GET、OPTIONS、DELETE 访问控制最大年龄:86400