使用 XHR 请求 API 时出现 CORS 错误

Posted

技术标签:

【中文标题】使用 XHR 请求 API 时出现 CORS 错误【英文标题】:I get a CORS-Error while doing a request for a API using XHR 【发布时间】:2021-12-13 11:05:18 【问题描述】:

我们正在向我们的一位在线分销商提出 API 请求。 但是,我们得到了一个 CORS 错误。

CORS 政策已阻止从源“http://www.im-cmp.ch”访问“https://api.cloud.im/marketplace/eu/products”处的 XMLHttpRequest:响应预检请求未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

我们在 Postman 中完成了请求,并且成功了。我尝试将 requestHeaders 设置为与 Postman 中设置的完全相同的方式(包括隐藏的标头),但是,由于无法设置隐藏的标头,因此出现错误。

拒绝设置不安全的标头“Host”

这是客户端问题还是服务器问题?我可能错过了 requestHeader 吗?

  var xhr = new XMLHttpRequest();
  xhr.withCredentials = true;

  xhr.addEventListener("readystatechange", function() 
    if(this.readyState === 4) 
      console.log(this.responseText);
   
  );

  xhr.open("GET", "https://api.cloud.im/marketplace/eu/products");
  xhr.setRequestHeader("X-Subscription-Key", "OUR PERSONAL SUBSCRIPTION KEY"); 
  xhr.setRequestHeader("Content-Type", "application/json");
  xhr.setRequestHeader("Authorization", "OUR BEARER TOKEN");
  //      xhr.setRequestHeader("Host", "http://www.im-cmp.ch/");
  xhr.setRequestHeader("accept", "*/*");
  //      xhr.setRequestHeader("Accept-Encoding", "gzip, deflate, br");
  //      xhr.setRequestHeader("Connection", "keep-alive");
  xhr.send();

【问题讨论】:

【参考方案1】:

这绝对是服务器问题。

服务器必须发送Access-Control-Allow-Origin-header:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS。

此外,错误指出这发生在 preflight-request 期间,这意味着事先提出了 OPTIONS 请求,这也需要 CORS 所需的响应标头。

该请求在 Postman 中有效,因为 CORS 是一项仅在浏览器中真正相关的功能,以保护用户。

编辑:

服务器允许您使用Access-Control-Allow-Headers-header 发送的请求标头也很重要:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers

【讨论】:

以上是关于使用 XHR 请求 API 时出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

向 ASP.NET Web API 发送请求时出现 CORS 错误

使用 POST API 时出现多个 CORS 错误

发出发布请求时出现NodeJS CORS错误

请求太重时出现 NodeJS CORS 错误(文件上传)

当我尝试将 google place 自动完成 API 与 Axios 一起使用时出现 CORS 错误

在Angular 4中将数据发送到JAVA post REST API时出现CORS错误