由于CORS,第三方API拒绝HttpClient获取请求-在浏览器和Powershell中有效

时间:2018-10-31 01:01:51

标签: angular

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

在我的浏览器和Powershell中,我可以直接使用相同的URL访问API,并获得JSON数据。当我使用HttpClient将其包装到Angular请求中时,出现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'
        })
      });

但是我得到了错误:

Refused to set unsafe header "Host"
Refused to set unsafe header "Accept-Encoding"
Refused to set unsafe header "Connection"

同时仍然出现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.

我有什么选择?

1 个答案:

答案 0 :(得分:1)

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

更新:

由于您无法与第三方联系以更改配置,因此另一个选择是使用其他服务器代理API请求。如果您在xyz.com上已经有服务器,则可以创建一个端点,如xyz.com/3rdPartyAPI,然后将请求发送到那里。然后,在服务器上,您可以使用curl或wget或其他方式以通常的方式请求内容,然后将响应转发回客户端。