如何绕过 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 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章
当我的 xmlhttprequest 被 CORS 阻止时,我如何连接 api [重复]
如何防止 CORS 策略阻止从本地主机到第三方 API 的请求?