如何从既没有 CORS 也没有 JSONP 的源在网页上使用 JSON? [关闭]

Posted

技术标签:

【中文标题】如何从既没有 CORS 也没有 JSONP 的源在网页上使用 JSON? [关闭]【英文标题】:How can I use JSON on the web page from a source with neither CORS nor JSONP? [closed] 【发布时间】:2012-01-22 04:22:53 【问题描述】:

Internet 上的某些 JSON 数据服务被设计为仅供服务器使用,而忽略了被纯网络应用直接使用的可能性。

由于跨站点问题,如果此类服务提供JSONP 格式或启用CORS 支持,则它们将起作用。

我想做一个javascript小工具,可以调用只返回JSON不返回的在线资源,不支持。

一个示例是我正在制作的单页应用程序,我能找到的唯一数据源没有提供CORSJSONP。作为一个单页应用,它没有自己的服务器,因此受制于同源策略。

在这种情况下有哪些可用的策略?

【问题讨论】:

【参考方案1】:

**一种方法是找到一个可以访问 JSON 数据源的代理,然后将其提供给您的 Web 应用程序,该应用程序已转换为使用 JSONCORS 或任何其他您可以在没有的情况下处理的格式担心跨站点问题。

这样的代理之一是Yahoo's "YQL"。

YQL 支持 JSONP 和 CORS。

因此,如果您的浏览器也支持 CORS,您可以将其视为免费的 JSON 到 JSON 代理服务器。如果不是,那么它也是一个免费的 JSON 到 JSONP 代理:

这是我如何将它与 jQuery 一起使用的示例:

$.getJSON("http://query.yahooapis.com/v1/public/yql",
  
    q:      "select * from json where url=\"http://airportcode.riobard.com/airport/" + code + "?fmt=JSON\"",
    callback: gotJSON, // you don't even need this line if your browser supports CORS
    format: "json"
  ,
  function(data)
    if (data.query.results) 
      /* do something with
        data.query.results.json.code
        data.query.results.json.name
        data.query.results.json.location
      */
     else 
      /* no info for this code */
    
  
);

And a version on jsfiddle...

【讨论】:

这将如何工作?你违反了同源策略,调用会失败。您不需要对 YQL 进行某种 JSONP 调用吗? 完全没有,因为 YQL 支持CORS,这是一个比 JSONP 更好的替代方案,因为它使用相同的 XHR 接口,而不是有一些缺点的脚本注入方法。如果您需要,YQL 也支持 JSONP。我会更新我的答案。 酷豆!我什至没有意识到这是一个 CORS 调用。我一直在努力弄清楚如何对 YQL 进行 JSONP 调用,结果证明我什至不必这样做。甜! jsonp.jit.su 太神奇了! “启用对任何 JSON API 的跨域请求。”它在 Github github.com/afeld/jsonp Here is a list of cors proxies

以上是关于如何从既没有 CORS 也没有 JSONP 的源在网页上使用 JSON? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

CORS - 没有 JSONP 的跨域 AJAX 通过允许服务器上的 Origin

【http】啥是cors跨域

当 JSONP 和 CORS 等变通方法存在时,为啥浏览器会有同源策略?

使用 JSONP 或 CORS 的跨域 JavaScript 调用

CORS和JSONP的区别,如何解决跨域问题?

如何解决 Ionic2 中的 CORS 问题和 JSONP 问题