Angular 第三方API拒绝HttpClient Get请求,因为CORS在浏览器和powershell中工作

Angular 第三方API拒绝HttpClient Get请求,因为CORS在浏览器和powershell中工作,angular,Angular,正如标题所述。我在CORS方面遇到了很多问题,并且在一个简单的GET请求上使用了第三方API 在我的浏览器和powershell中,我可以使用相同的URL直接访问API,并获得JSON数据。当我用HttpClient将其包装成角度请求时,我得到了CORS错误 我无法修改服务器,也没有找到任何适合我的用例的答案 在检查网络流量后,我尝试修改标题以匹配浏览器发送的内容: return this._http.get<FullResponse>(finalEndpoint, {

正如标题所述。我在CORS方面遇到了很多问题,并且在一个简单的GET请求上使用了第三方API

在我的浏览器和powershell中,我可以使用相同的URL直接访问API,并获得JSON数据。当我用HttpClient将其包装成角度请求时,我得到了CORS错误

我无法修改服务器,也没有找到任何适合我的用例的答案

在检查网络流量后,我尝试修改标题以匹配浏览器发送的内容:

return this._http.get<FullResponse>(finalEndpoint,
      {
        headers: new HttpHeaders({
          'Host': 'api.<third party>.com',
          'Accept-Encoding': 'gzip, deflate, br',
          'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
          'Cache-Control': 'max-age=0',
          'Connection': 'keep-alive'
        })
      });
还有一个CORS错误

Access to XMLHttpRequest at 'https://<GET URL>' from origin 'Localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
从源“Localhost:4200”访问位于“https://”的XMLHttpRequest已被CORS策略阻止:请求的资源上不存在“Access Control Allow origin”头。

我有什么选择

不允许设置主机、接受编码和连接头。出于安全原因,只能由用户代理设置它们。请参阅列表。您应该尝试找出在使用HttpClient发送请求时出现的原始CORS错误

更新:


因为您无法联系第三方来更改配置,所以另一个选项是使用不同的服务器来代理API请求。如果您在xyz.com上已经有一个服务器,那么您可以创建一个端点,如xyz.com/3rdPartyAPI,并将您的请求发送到那里。然后,在服务器上,您可以使用curl、wget或其他任何方式请求内容,然后将响应转发回客户端

api本身需要一个“主机”头?当我查看Chrome中的流量时,它就是这样的,所以我假设有一些拦截正在进行。是的,让浏览器设置标题。当从web应用程序向不同来源的api发出Ajax/fetch调用时,必须从服务器发出CORS头。此api可能要求您注册web应用程序的源代码,以实现此目的。这也是为什么它可以通过PS和直接浏览器输入而不是Angular应用程序工作的原因。Ajax/fetch更具限制性,并强制执行CORS。。。为了保护您:-)“您应该尝试找出在使用HttpClient发送请求时出现的原始CORS错误。”-好的。。。那么有什么帮助吗?您需要在问题中包含错误消息。添加了错误消息,但没有非常详细的说明。您确定第三方服务器已正确设置CORS,因为根据错误消息,它缺少服务器上所需的标头。您可以在浏览器中访问url,因为这不是跨源请求。我无法访问第三方,也无法请求他们更改其配置。
Access to XMLHttpRequest at 'https://<GET URL>' from origin 'Localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.