不控制服务器时的跨源资源共享?

时间:2017-06-14 20:06:23

标签: javascript node.js xml cors

我有一个Web应用程序,我想使用其他网页的信息。一个典型的例子是从预测服务获取XML格式的天气信息。说“https://www.yr.no/place/United_States/New_York/New_York/varsel.xml”。当我尝试使用XMLHttpRequest的GET请求时,我得到典型的Cross-Origin错误。

对此的简单解决方案是使服务器允许CORS。但是,如果我无法控制给定的服务器怎么办?有没有其他方式来请求数据?

我已尝试过针对Chrome的Enable-CORS扩展程序,但这不是一个好的解决方案。此外,如果请求数据的站点需要身份验证,例如用户名/密码,则无效。

我似乎无法找到有关此问题的任何信息,但如果这是重复我道歉。

1 个答案:

答案 0 :(得分:2)

For the simple case of just wanting to get the content of a publicly-available resource on the Web like https://www.yr.no/place/United_States/New_York/New_York/varsel.xml并在您的前端JavaScript代码中执行某些操作,您无需设置自己的代理,但可以使用现有的开放式公共CORS代理,如https://cors-anywhere.herokuapp.com/

不是将https://www.yr.no/place/United_States/New_York/New_York/varsel.xml提供给XHR / Fetch调用(或jQuery.get()或axios或任何调用),而是给它这个URL:

https://cors-anywhere.herokuapp.com/https://www.yr.no/place/United_States/New_York/New_York/varsel.xml

通过开放的CORS代理https://cors-anywhere.herokuapp.com发送请求,该代理向其添加Access-Control-Allow-Origin响应标头,然后将其作为响应传递回您的请求前端代码。

带有Access-Control-Allow-Origin响应标头的响应是浏览器看到的,因此浏览器允许您的前端JavaScript代码实际访问响应。

但是,如果您要求数据的网站需要身份验证,那么您不希望通过第三方代理(例如https://cors-anywhere.herokuapp.com)发出请求 - 因为那样您就会将凭据公开给第三方派对(第三方代理的所有者)。

但是对于这种情况,使用https://github.com/Rob--W/cors-anywhere中的代码或其他类似代码来设置您自己的私有代理是相当快速和容易的 - 或者在您现有的后端代码中设置一些简单的代理机制。