javascript - 对预检请求的响应未通过访问控制检查错误

标签 javascript xmlhttprequest cors preflight

我正在努力解决的确切错误是“对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin” header 。因此,Origin“null”不存在允许访问。”。

我正在尝试使用 JavaScript 从 https://api.kraken.com/0/public/OHLC?pair=ETHEUR 获取 JSON 数据。我创建了一个 XMLHttpRequest 对象来执行此操作,并将 GET 指定为请求类型。这应该是一个简单的请求,但错误表明已发送预检请求。这种行为的原因是什么?话虽这么说,为了修复此错误,我尝试设置一个请求 header ,在其中指定“*”作为 Access-Control-Allow-Origin 的值,但仍然收到错误。我浏览了与我类似的问题的答复,但无法弄清楚如何解决我正在处理的问题。这可能是因为对 JavaScript 还很陌生。不管怎样,下面是我编写的代码:

    var requestURL = 'https://api.kraken.com/0/public/OHLC?pair=ETHEUR'

    var request = new XMLHttpRequest();
    request.open('GET',requestURL,true);
    request.responseType = 'json';

    request.onload = function(){ 
        var data = request.response; 
        console.log(data); 
    }


    request.setRequestHeader('Access-Control-Allow-Origin','*');

    request.send(); 

最佳答案

在这种情况下,您尝试向其发出跨域请求的服务器不会发送 Access-Control-Allow-Origin响应 header ,如果您想从浏览器中运行的前端 JavaScript 代码向该服务器发出请求,您唯一的选择是使用 CORS 代理。否则,您的浏览器将不允许您的前端 JavaScript 代码访问响应。

因此,如果您将代码更改为如下所示,则可以使请求成功:

var proxyURL = 'https://cors-anywhere.herokuapp.com';
var requestURL = 'https://api.kraken.com/0/public/OHLC?pair=ETHEUR';
var request = new XMLHttpRequest();
request.open('GET', proxyURL + '/' + requestURL, true);

通过 https://cors-anywhere.herokuapp.com 发送请求,它将请求转发到 https://api.kraken.com/0/public/OHLC?pair=ETHEUR然后收到响应。 https://cors-anywhere.herokuapp.com后端添加 Access-Control-Allow-Origin响应的 header 并将其传递回您请求的前端代码。

然后,浏览器将允许您的前端代码访问响应,因为该响应带有 Access-Control-Allow-Origin响应头是浏览器看到的。

您还可以使用 https://github.com/Rob--W/cors-anywhere/ 轻松设置您自己的 CORS 代理

另请注意 request.setRequestHeader('Access-Control-Allow-Origin','*')需要从您发出请求的前端代码中删除(如上面的评论中所述)。

那是因为Access-Control-Allow-Origin严格来说是服务器发送响应的响应 header ;从客户端在请求中发送它除了触发浏览器执行不必要的操作之外没有任何效果CORS preflight OPTIONS request那会失败的。

详细了解当您使用 XHR 或 JavaScript 库中的 Fetch API 或 AJAX 方法从前端 JavaScript 代码发送跨源请求时浏览器会执行哪些操作,以及有关浏览器必须接收哪些响应 header 才能允许前端代码的详细信息要访问回复,请参阅 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS .

var proxyURL = 'https://cors-anywhere.herokuapp.com';
var requestURL = 'https://api.kraken.com/0/public/OHLC?pair=ETHEUR';

var request = new XMLHttpRequest();
request.open('GET', proxyURL + '/' + requestURL, true);
request.responseType = 'json';

request.onload = function() {
  var data = request.response;
  document.querySelector('pre').textContent = JSON.stringify(data, null, 2);
}

request.send();
<pre></pre>

关于javascript - 对预检请求的响应未通过访问控制检查错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45625730/

相关文章:

javascript - 用javascript显示循环的所有结果?

jQuery ajax 在简单的帖子上总是返回错误

firefox - 为什么此 CORS 请求仅在 Firefox 中失败?

javascript - CORS 飞行前返回 Access-Control-Allow-Origin :*, 浏览器仍然失败请求

javascript - 查看 Chrome 控制台是否打开

javascript - 将 id 属性分配给 li 不起作用

javascript - 在 XMLHttpRequest 之后打开页面

google-chrome - Chrome 和其他浏览器会放弃对同步 XMLHttpRequest 的支持吗?

go - 如何在 Go 中启用 CORS

javascript - 如何将额外数据与 Tag-it 标签一起存储?