如何在不更改后端的情况下解决 Angular 8 中的 CORS 问题?

Posted

技术标签:

【中文标题】如何在不更改后端的情况下解决 Angular 8 中的 CORS 问题?【英文标题】:How to address CORS issue in Angular 8 without changing the backend? 【发布时间】:2020-06-25 03:36:23 【问题描述】:

我正在尝试从在 localhost:4200 上运行的 Angular 应用程序向后端 (https://api.zenefits.com/core/people) 发送 GET 请求。我尝试了许多选项并阅读了许多博客文章,但找不到任何适合我的东西。我尝试使用代理方法解决此问题,因为我无权访问后端,但这仍然给我以下 CORS 错误:

Access to XMLHttpRequest at 'https://api.zenefits.com/external/people/' (redirected from 'http://localhost:4200/core/people') 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.

以下是我的服务:

import  Injectable  from '@angular/core';
import  HttpClient, HttpHeaders  from '@angular/common/http';

@Injectable(
  providedIn: 'root'
)
export class EmployeeService 

  employeeQueryUrl: string;
  constructor(private http: HttpClient) 
    this.employeeQueryUrl = 'https://api.zenefits.com/core/people';
  

  getAllEmployees() 
    return this.http.get(
      this.employeeQueryUrl, 
        headers: new HttpHeaders(
          Authorization: 'Bearer elZxQlHDSUallvL3OnnH'));
  


以下是我的proxy.conf.json:


    "/core/*": 
      "target": "https://api.zenefits.com/core/people",
      "secure": false,
      "changeOrigin": true,
      "logLevel": "debug"
      

我尝试了很多方法,但都是徒劳的。文档不清楚文件的外观。我无法理解为什么错误消息中的 URL 也更改为 external/people 而不是 core/people。 我知道那里有很多类似的问题,但其中大多数配置了后端,我无权访问它。其余的对我不起作用。因此,任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您必须更改您的 api url 才能使用代理(使用相对 url),而不是直接使用 api 服务。

将以下变量更改为

this.employeeQueryUrl = '/core/people';

您的代理配置需要更新为


    "/core/*": 
      "target": "https://api.zenefits.com/",
      "secure": false,
      "changeOrigin": true,
      "logLevel": "debug"
      

然后,您的 api 调用将被代理接听,并将所有请求从 /core/* 重定向到 https://api.zenefits.com/core/*

这是来自Angular的文档

【讨论】:

我遵循了这个但仍然没有解决我的问题;( 您是否重新启动了服务器?我的意思是,您是否终止了进程并重新运行ng serve 是的,我重启了服务器,问题依旧。 您是否将以下行添加到您的angular.json 服务 - 选项配置中? "proxyConfig": "src/proxy.conf.json"? 我也想知道,你希望api调用最终是https://api.zenefits.com/external/people/还是https://api.zenefits.com/core/people/【参考方案2】:

您无法使用 angular(front-end) 本身消除 CORS 错误,您还需要确定从后端解决它。

但是对于角度部分,你可以做的是使用 proxy.config 文件:

  
 "/api/*":   
  "target": "http://localhost:57263",  
  "secure": false,  
  "logLevel": "debug"  
   
 

并添加对 angular.json 文件的代理引用。

按照这些步骤,你会很高兴(下面的链接解决了 angular+node 的问题,对于你的后端技术,只需 google 搜索就可以了..) https://www.techiediaries.com/fix-cors-with-angular-cli-proxy-configuration/

希望对你有帮助!!

【讨论】:

我对此有点困惑。你说 Angular 自己解决不了,那为什么还要贴代理配置呢?目标也是后端的网址,对吗?或者是别的什么?实际上,这些是我陷入困境的一些细节,使我发布了这个问题。 我认为你应该阅读这篇文章,我从那里了解到 CORS。也许这会对你有所帮助link

以上是关于如何在不更改后端的情况下解决 Angular 8 中的 CORS 问题?的主要内容,如果未能解决你的问题,请参考以下文章

Angular 路由器:(类似 TAB 的)导航 - 如何在不再次运行 ngOnInit 的情况下更改 URL

使用 AOSP 对 dts 进行更改后如何在不使用 make clean 的情况下构建?

如何在不重新加载页面的情况下从 FF Web 扩展内容脚本更改 3rd 方网站上的 Angular 应用程序路由/URL

如何在不订阅 Angular 表单提交的情况下创建/更新项目

如何在不移动地图的情况下更改 GMSMapView 填充

如何在不实现我自己的数据库后端的情况下保存站点的状态?