【问题标题】:OpenFIGI API and CORSOpenFIGI API 和 CORS
【发布时间】:2017-12-21 14:22:07
【问题描述】:

我正在尝试从浏览器应用程序连接 OpenFIGI API,我使用节点的 http 服务器在本地托管该应用程序。我的 POST 请求如下所示

  var xhr = new XMLHttpRequest();
  var url = 'https://api.openfigi.com/v1/mapping';
  var params = [{"idType": "ID_WERTPAPIER", "idValue": "851399", "exchCode": "US"}];
  xhr.open('POST', url, true);
  xhr.setRequestHeader("Content-type", "text/json");
  xhr.onreadystatechange = function() {
    console.log(xhr.responseText);
  }
  xhr.send(params);

但我得到的只是错误

  • 加载资源失败:服务器响应状态为 405(方法不允许)
  • XMLHttpRequest 无法加载 https://api.openfigi.com/v1/mapping。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://127.0.0.1:20000' 不允许访问。响应的 HTTP 状态代码为 405。

由于我一直在尝试不同的方式来完成请求和不同的设置,我想知道 - 这是否可能?我错过了什么吗?要求?我查看了 OpenFIGI API 示例,但在那里找不到任何其他 (CORS) 设置。

【问题讨论】:

    标签: javascript xmlhttprequest cors


    【解决方案1】:

    OpenFIGI API 响应不包含使浏览器允许您的前端 JavaScript 代码访问响应所需的 Access-Control-* 响应标头。所以如果你想从你的前端代码发送请求,你唯一的选择就是使用代理。

    要尝试通过公共 CORS 代理发出请求,请尝试将您的代码更改为:

    var url = 'https://cors-anywhere.herokuapp.com/'
       + 'https://api.openfigi.com/v1/mapping';
    

    通过https://cors-anywhere.herokuapp.com 发送请求,https://cors-anywhere.herokuapp.com 将请求转发到https://api.openfigi.com/v1/mapping,然后接收响应。 https://cors-anywhere.herokuapp.com 后端然后将 Access-Control-Allow-Origin 标头添加到响应中,最后将其传递回您的请求前端代码。

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

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

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

    【讨论】:

    • 我正在尝试使用 @sideshowbarker 的修复程序运行 lz129 的代码。小提琴在这里:jsfiddle.net/theo/qvq4xLgy 每次我运行代码时都会出现 400 错误。有什么解决办法吗?
    • @sideshowbarker - 看起来像添加了我在你的名字之后添加的撇号,阻止你收到我之前的消息的通知。请您看一下这条消息上方的消息吗?
    • @Theo 不知道。您可能想将其作为一个单独的问题发布。我突然想到:如果返回 400 错误可能表明,您发布的 JSON 数据不是 API 端点所期望的格式。尝试使用 curl 或 postman 或其他方式发布相同的数据,如果您在这样做时也得到 400,那么您知道问题出在您的数据上,而不是您用于发布它的特定机制。跨度>
    • @sideshowbarker 感谢您的快速回复。相同的数据适用于 Curl。我将作为单独的问题重新发布。
    • @sideshowbarker jsFiddle - jsfiddle.net/theo/qvq4xLgy - 现在可以使用。它所需要的只是包含在引号中的参数。
    猜你喜欢
    • 2017-08-25
    • 2016-10-07
    • 2017-02-19
    • 2015-07-27
    • 2014-11-25
    • 2016-01-02
    • 2014-10-19
    • 2013-05-20
    • 2016-07-21
    相关资源
    最近更新 更多