我一直在与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上会返回405
,Pre-flight Warning
或Invalid Request
我已经松散地理解你在服务器端允许它,但我必须假设并非每个站点都允许邮递员等连接,也不是每个我注册的供应商允许我域。
如何在API调用中绕过CORS合规性呢?我已经尝试了很多我读过的东西,包括crossDomain,Cross-Origin Header等,并且总是得到相同的结果。
有什么见解?
答案 0 :(得分:4)
它被标记为预检的原因是您要发送的额外标题。除非您传递自定义标头,否则GET
请求不必使用预检请求。您有两种选择:
最简单的解决方案是删除您尝试发送的自定义标头,并且该请求不应再被标记为需要CORS预检。
如果您托管服务器代码,则可以检查传入请求(服务器端)以查看它是否具有请求方法OPTIONS
。如果是这样,您知道这是预检,并且应该响应一个响应,告诉客户端哪些标题是可接受的。要允许所有自定义标头,预检响应应包含'Access-Control-Request-Headers': '*'
响应标头。
每https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS:
更新:根据https://developer.wunderlist.com/documentation/concepts/authorization,您必须注册申请才能与他们交谈。在该过程的某个地方,他们可能会自动开始为您的域发送预检请求,或允许您设置标题。