离子应用程序被CORS策略阻止,jsonp也不起作用



我正在开发一个角度为 5 的 Ionic 应用程序,我使用命令在 localhost 中运行它ionic serve -l

我有一个外部网络 https://example.com/api?req1=foo&req2=bar 的电话

但是我收到 CORS 拒绝消息并且没有响应。

无法加载 https://example.com/api?req1=foo&req2=bar:CORS 策略已阻止从"https://example.com/api?req1=foo&req2=bar"重定向到"http://example.com/api?req1=foo&req2=bar":请求的资源上不存在"访问控制允许源"标头。因此,不允许访问源"http://localhost:8100"。

请求代码很简单:

getSomethingList(req1: number, req2: number): Observable<Item[]> {
const requestUrl = 'https://example.com/api?req1=foo&req2=bar';
return this._http.get(requestUrl).map((res: Response) => res.json());
}

我尝试安装 chrome 扩展程序Moesif Origin & CORS changer激活它并将原点放在http://localhost:8100/(运行我的 ionic 应用程序的地方)。仍然没有结果,但现在我没有看到被拒绝的 CORS 错误,我根本没有看到任何错误。

我尝试了代理:

// file ionic.config.json
{
"name": "movielovers",
"app_id": "",
"type": "ionic-angular",
"integrations": {
"cordova": {}
},
"proxies": [{
"path": "/api",
"proxyUrl": "https://example.com/api"
}]
}

然后const requestUrl = 'https://example.com/api?req1=foo&req2=bar'改为const requestUrl = '/api?req1=foo&req2=bar',我仍然不知道我在做什么,对我来说它没有任何意义,但这是我阅读一些教程所理解的。

这样显然,我得到错误:

获取 http://localhost:8100/api?req1=foo&req2=bar 404(未找到)

我尝试安装 nom corsproxy:npm install -g corsproxy并在命令行中运行 corsproxy。这将在端口中启动服务器。但这行不通。我甚至尝试将 corsproxy 与 ionic.config.json 文件中的代理混合,但没有办法。永远得不到答案。

最后我尝试使用 jsonp:

  • 首先我在app.module.ts中import { JsonpModule } from '@angular/http';,并在导入中声明JsonpModule。

  • 然后在我有请求的提供程序中,我注入 Jsonp 库constructor(private jsonp: Jsonp) {}

  • 我在请求网址的末尾添加一个回调:const requestUrl = 'https://example.com/api?req1=foo&req2=bar&callback=JSONP_CALLBACK'

  • 更改请求方法: return this.jsonp.request(requestUrl).map((res: Response) => res.json());

使用 jsonp 时,控制台中的错误是:

未捕获的语法错误: 意外令牌 :

我不知道还有什么尝试,由于 CORS 我无法得到任何回应。我请求的 api 不受限制,响应邮递员也是如此,甚至可以直接在浏览器中写入请求 URL。但是当从本地主机运行时,它显然被阻止了,我无法克服它,我浪费了很多时间试图得到响应。我需要一些帮助。

  • 离子: 3.20.0
  • 科尔多瓦
  • 角度 CLI:1.7.3
  • 节点:8.9.4

仅供参考:我正在使用的 API 是 https://www.comicvine.com/api

编辑:已安装的科尔多瓦插件白名单

添加了 www/index.html<meta http-equiv="Content-Security-Policy" content="script-src * 'unsafe-inline' 'unsafe-eval'">

文件配置.xml包含以下行:

<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-navigation href="*" />

最后我解决了它,首先我将所有代码返回到我得到 CORS 拒绝答案的初始点(删除所有代理引用、jsonp 等)。然后我删除了 chrome 扩展Moesif Origin & CORS changer并安装了 chrome 扩展程序 Allow-Control-Allow-Origin:*,打开它,现在它工作正常。

也许它在未来对某人有帮助,并为他/她节省大量时间。

CORS 必须在服务器端正确处理。当您不拥有服务器端时,您只能为 CORS 设置一个代理,以正确处理来自应用程序的请求并将它们重定向到 api(一个简单的 php 脚本就可以了),但有许多现成的解决方案在那里

您无法禁用 CORS。它是基础 Web 视图中的一项安全"功能"。

对于您的 npm corsproxy 的具体问题,请尝试

  1. 不要使用 ionic 代理设置。
  2. 在命令行上运行 corsproxy 。
  3. 将您的 API 调用更改为 http://localhost:1337/my.domain.com/path/to/resource 其中 my.domain.com/.. 是您在 Comicvine 中已经在使用的服务器和路径

如果这不起作用,请尝试"即用型解决方案"列表中的一些内容。

在代理中更改 Config.xml 文件并添加新的配置属性:

<allow-navigation href="http://*/*" />
<allow-intent href="https://*/*" />

或者,如果这不起作用,您可以安装 Cordova,然后添加"Cordova插件添加 Cordova-plugin-whitelist":

1 - 将<allow-navigation href="*" />添加到配置.xml

2 - 将<meta http-equiv="Content-Security-Policy" content="script-src * 'unsafe-inline' 'unsafe-eval'">添加到索引的标题中.html

最新更新