每次请求都有预检或CORS错误

时间:2016-12-21 00:10:58

标签: javascript ajax cors

我一直在与CORS斗争很长一段时间,但仍然没有接近完全理解。

我最简单的例子是使用Wunderlist API -

使用以下代码:

 var settings = {
  "async": true,
  "crossDomain": true,
  "url": "http://a.wunderlist.com/api/v1/lists",
  "method": "GET",
  "headers": {
    "x-client-id": "{ID}",
    "x-access-token": "{TOKEN}",
    "cache-control": "no-cache"
  },
  "data": "{\n\t\"revision\": 1,\n\t\"completed\": true\n}"
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

在Postman / Fiddler中将返回结果。但是,将其投放到基本网站或Codepen上会返回405Pre-flight WarningInvalid Request

我已经松散地理解你在服务器端允许它,但我必须假设并非每个站点都允许邮递员等连接,也不是每个我注册的供应商允许我域。

如何在API调用中绕过CORS合规性呢?我已经尝试了很多我读过的东西,包括crossDomain,Cross-Origin Header等,并且总是得到相同的结果。

有什么见解?

1 个答案:

答案 0 :(得分:4)

它被标记为预检的原因是您要发送的额外标题。除非您传递自定义标头,否则GET请求不必使用预检请求。您有两种选择:

  1. 最简单的解决方案是删除您尝试发送的自定义标头,并且该请求不应再被标记为需要CORS预检。

  2. 如果您托管服务器代码,则可以检查传入请求(服务器端)以查看它是否具有请求方法OPTIONS。如果是这样,您知道这是预检,并且应该响应一个响应,告诉客户端哪些标题是可接受的。要允许所有自定义标头,预检响应应包含'Access-Control-Request-Headers': '*'响应标头。

  3. https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

    enter image description here

    更新:根据https://developer.wunderlist.com/documentation/concepts/authorization,您必须注册申请才能与他们交谈。在该过程的某个地方,他们可能会自动开始为您的域发送预检请求,或允许您设置标题。