如何绕过 CORS 并从 CORS 阻止的 API 获取数据?

Posted

技术标签:

【中文标题】如何绕过 CORS 并从 CORS 阻止的 API 获取数据?【英文标题】:How to bypass CORS and get data from CORS blocked API? 【发布时间】:2017-08-31 05:34:30 【问题描述】:

我正在开发 Spring Boot 应用程序,我遇到了一个要求,我需要请求(获取)一个已经在 Internet 上可用的 API(由某人开发,仅供演示)并获取数据。但是该 API 阻止了 CORS 请求。虽然我可以在浏览器中点击 api 并查看 json 响应,但我无法在我的 spring java 代码中点击 API。我收到 403 禁止异常。有没有办法解决这个问题?谢谢

java代码

String endPoint="www.api.blahblah.com"; (sample only)

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response= restTemplate.getForEntity(endPoint+userName,String.class);

【问题讨论】:

你在本地测试吗? 不,我已经部署到heroku 【参考方案1】:

为了获取数据并绕过 CORS,您可能需要使用 JSONP 格式的 API

JSONP

这是一种带有填充的 JSON 格式,允许您从与您所在域不同的服务器请求数据。

如果您在本地主机上,您可以使用适合您浏览器的扩展名禁用 CORS 检查(尽管不推荐),但仍使用外部 JSON API。

例如,您可以使用 Chrome 扩展程序来实现此目标: Allow-Control-Allow-Origin: *

我相信其他浏览器也与此类似。

【讨论】:

可以在java rest客户端中使用JSONP吗?我认为这只能与 javascript 一起使用 这个答案假设您可以控制服务器,我认为这违背了问题的目的;如果你控制服务器,你可能可以添加 CORS 支持。【参考方案2】:

浏览器通过设计限制访问,除非服务提供商通过 CORS(或 JSONP 之类的替代/hack)允许它。

在这种情况下,唯一现实的选择是代理 API,即设置您自己的中间服务器以在 3rd 方 API 之间将数据传输到您的客户端。

【讨论】:

【参考方案3】:

CORS 是 W3C 规范,允许从浏览器进行跨域通信。你不需要绕过CORS。 您需要绕过Same Origin Policy,这是浏览器处理的限制。

我也对此感到困惑,我建议看看:https://www.html5rocks.com/en/tutorials/cors/

但是因为您是在浏览器之外提出请求,所以 SOP 不应该参与其中。我认为您由于其他原因收到了禁止的错误代码。

检查端点是否需要一些特殊参数,或者如果您有成功请求的示例,我们可以帮助您了解如何从 java 重现它。

【讨论】:

【参考方案4】:

也可以查看开源程序Bypass Cors, 一个可安装的 Electron 应用程序(Windows/Mac/Linux),可让您永久绕过所有 CORS 限制, 通过允许您设置自己的自定义标题 (+Origin)。

它专为与 Web 应用程序一起使用而设计,非常适合实时抓取。

免责声明:我是该程序的作者。

【讨论】:

以上是关于如何绕过 CORS 并从 CORS 阻止的 API 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

nodejs api没有框架,如何绕过CORS?

如何通过我的 api 调用绕过 CORS 限制? [复制]

当我的 xmlhttprequest 被 CORS 阻止时,我如何连接 api [重复]

如何防止 CORS 策略阻止从本地主机到第三方 API 的请求?

对 Tomcat 服务器进行 API 调用时如何修复“被 CORS 策略阻止”错误

可以使用中间层作为 API 绕过 CORS 吗?