【发布时间】:2021-05-03 20:42:40
【问题描述】:
我必须从托管在在线外部服务器上的 json 获取数据。网址看起来像http://example.com/path/to/resource.json。我可以通过浏览器、邮递员和其他工具读取这个 json。
但是当我尝试从 Angular 11 应用程序中获取数据时,我收到了 CORS 错误:
Access to XMLHttpRequest at 'http://example.com/path/to/resource.json'
from origin 'http://localhost:4200' has been blocked by CORS policy:
Response to preflight request doesn't pass access control check:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
代码实际上只是带有HttpClient 类的GET:
this.http.get('http://example.com/path/to/resource.json)'
我尝试的是配置代理但没有成功:
// proxy.conf.json
{
"/path": {
"target": "http://example.com",
"secure": false
}
}
// angular.json
"serve": {
[...]
"options": {
[...]
"proxyConfig": "proxy.conf.json"
},
[...]
},
这两个文件都在项目的根文件夹中。
我对服务器没有控制权,所以我不能允许 CORS 或更改其他设置,但我认为这不是问题。
我不明白为什么我可以通过许多工具访问资源,但我在使用 Angular 时总是遇到问题。
【问题讨论】:
-
由于您无法控制服务器,我建议您查看此帖子。 stackoverflow.com/questions/35588699/…
-
CORS 实际上不是 Angular 问题 - 它是需要它的浏览器(以及执行 OPTIONS 预检的浏览器)。为了让您的代理工作,您必须使用相对路径,所以 this.http.get('/path/to/resource.json)'
-
在运行应用程序时尝试使用扩展程序。比如这个:Allow CORS: Access-Control-Allow-Origin
-
所以这不是 Angular 问题,它只是一些浏览器块。我尝试了一个 Chrome 扩展程序,它可以工作,但我只能将它用于开发。有没有办法让它在没有浏览器扩展的情况下从 Angular 代码中工作?我需要将项目展示给其他人,我不能强制安装浏览器扩展。为什么使用其他工具我可以毫无问题地获取资源,但它不适用于使用
HttpClient的 Angular?
标签: angular cors angular-httpclient preflight