【问题标题】:Preflight, or CORS error, on every request每个请求的预检或 CORS 错误
【发布时间】:2017-05-06 07:31:11
【问题描述】:

我已经在 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

我大致了解您允许在服务器端使用它,但我必须假设并非每个站点都允许 Postman 等连接,也不是每个我注册的供应商都允许我的领域。

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

有什么见解吗?

【问题讨论】:

  • GET 从来没有预检限制。但是,POST 可以。
  • @Mike'Pomax'Kamermans - 不正确 - 自定义标头触发预检
  • @JaromandaX 请引用说明这一点的规范,因为我不知道该限制,并希望看到一个权威链接来确认您的声明。
  • @Mike'Pomax'Kamermans - MDN 是否足够权威? developer.mozilla.org/en-US/docs/Web/HTTP/…
  • 作为一名 Mozilla 员工:你敢打赌!

标签: javascript ajax cors


【解决方案1】:

它被标记为预检的原因是您发送的额外标头。 GET 请求不必使用预检请求,除非您传递 custom 标头。你有两个选择:

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

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

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

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

【讨论】:

  • 假设 wunderlist 完全支持 CORS 请求
  • @JaromandaX - 如果他们需要 x-access-token 标头,并希望他们的 api 可用,他们应该支持 CORS。
  • 仍然是一个假设:p
  • @cchamberlain 感谢链接。它实际上被引用以反弹回我的 localhost:8080 源,这就是被拒绝的内容。我已经修改了基础,但这似乎是我需要的。谢谢。
  • 可能是他们不信任本地主机。你试过不同的浏览器吗?
猜你喜欢
  • 2015-08-10
  • 2014-08-07
  • 2020-10-26
  • 2019-04-11
  • 2020-04-09
  • 2016-07-06
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多