cors - 调用第 3 方 API 时处理 CORS

标签 cors angular-httpclient

是的,这是一个非常有名的问题,我尝试了之前堆栈溢出 QnA 中提到的许多方法,但没有任何效果。我正在尝试使用 BANZAI-Cloud我的应用程序中的 API,但它给出了以下错误
enter image description here
这是我的服务类代码

import { Injectable } from '@angular/core';
import {HttpClient} from '@angular/common/http';
import { Observable } from 'rxjs';
import { HttpHeaders } from '@angular/common/http';

@Injectable({providedIn:"root"})
export class PriceTableService{
   
    private priceurl = "https://banzaicloud.com/cloudinfo/api/v1/providers/google/services/compute/regions/asia-east2/products"
    // private priceurl = "https://jsonplaceholder.typicode.com/posts"
    
    constructor(private http:HttpClient){}
    httpOptions = {
        headers: new HttpHeaders({
            'Access-Control-Allow-Methods':'DELETE, POST, GET, OPTIONS',
            'Access-Control-Allow-Headers':'Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With',
            'Content-Type':  'application/json',
            'Access-Control-Allow-Origin':'http://localhost:4200'
        })
      };
    getPrices(){
            this.http.get(this.priceurl,this.httpOptions).subscribe(result=>{
            console.log(result);
            return(result);
        })
     }
    ngOnInit() {
    }
}
APIPOSTMAN 工作和 CHROME但是当我用任何其他虚假的 URL 替换 URL 时,无法将数据导入我的 Angular 应用程序 API我可以获得数据,但是上面提到的 API 没有提供数据,如果有人能帮我解决这个问题,那将是一个很大的帮助。

最佳答案

首先,您需要了解 CORS 检查是由浏览器完成的。这是 W3C 规范。任何像 Postman 这样的扩展或工具都不受此约束。这就是您通过 Postman 获得结果的原因。

另一件事是,您尝试向请求添加 Access-Control-Allow-Origin header 。这不是 CORS 规范所期望的。您需要在响应中包含 Access-Control-Allow-Origin header 。这意味着它需要由服务器端添加。

由于您正在调用 3rd 方 API,因此我相信您无法控制服务器。因此,通过设置 Access-Control-Allow-Origin 来要求处理 CORS 问题是不可能的。

假设您无权访问服务器,有 3 种方法可以解决此问题。

  • 通过在浏览器中禁用 CORS 检查(不推荐用于生产)。
  • 通过在浏览器中使用 CORS 插件(不推荐用于生产)。
  • 通过代理请求资源 - 最简单的方法,你可以做的是,编写一个小型节点服务器(或者如果你已经有一个后端将它与你的前端关联,你可以使用它)它会请求3rd 方 API 并发回响应。现在在该服务器响应中,您可以允许跨域 header 。
  • 关于cors - 调用第 3 方 API 时处理 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58122615/

    相关文章:

    angular - 从 Material Icon Registry 加载图标时出现 "<svg> tag not found"错误

    angular - 将 http 响应映射到 Angular 7 中的接口(interface)

    javascript - 使用 StreamSaver.js 流式传输大型 blob 文件

    node.js - 如何在 Angular 应用程序中显示 Node js api 错误

    angular - 如何从 Angular http 的响应中读取状态?

    javascript - Chrome Websockets CORS 政策

    reactjs - tomcat apache 8 服务器上的 Pentaho API(端口 - 8080)在通过不同的 Web 应用程序(react JS,端口 - 3000)调用时会出现 COR 问题

    node.js - 为什么向 OPTIONS 路由添加 CORS header 不允许浏览器访问我的 API?

    angularjs - Angular js : Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource