【问题标题】:Angular 2: Response to preflight request doesn't pass access control checkAngular 2:对预检请求的响应未通过访问控制检查
【发布时间】:2017-08-10 19:30:42
【问题描述】:

我的 Angular 2 应用程序出现一个非常奇怪的错误:

XMLHttpRequest 无法加载 https://api.ebay.com/ws/api.dll。回复 预检请求未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:4200” 访问。

烦人的是我确实有那个标题:

headers.append("Access-Control-Allow-Origin", "*")
headers.append('Access-Control-Allow-Methods', "GET, POST, PATCH, PUT, DELETE, OPTIONS")
headers.append('Access-Control-Allow-Headers', "Origin, Content-Type, X-Auth-Token")

Charles 代理的屏幕截图:

【问题讨论】:

  • 标头需要由您从服务器获得的响应添加。在请求中添加它们是没有用的。另见developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
  • 解决方法是什么?我显然不在 eBay 工作,也无法更改他们的标题
  • 不要访问不应该以这种方式使用的 API ;-) 您可以尝试使用 JsonpModule 而不是 HttpModule,但是这种方法有一些限制(不能自定义标头发送)。另一种方法是运行您自己的服务器,将请求转发到 Ebay 服务器并响应浏览器。
  • 一种通用的解决方法是设置您自己的 CORS 代理,或者将请求 URL 替换为通过开放代理请求它的 URL,如下所示:cors-anywhere.herokuapp.com/https://api.ebay.com/ws/api.dll

标签: angular cors


【解决方案1】:

我在这里找到了一个我喜欢使用代理服务器的解决方案:

Configure a proxy for your API calls with Angular CLI

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-06-05
  • 2018-04-29
  • 2018-05-15
相关资源
最近更新 更多