你如何正确和可靠地加载JSON数据交叉

我目前正在研究Chrome的userscript / extension,并试图从“某些网站”提取一些JSON数据。 这是我的方法:

$.get( "http://cloud.hartwig-at.de/~oliver/superuser.json", 
       function( data ) { console.log( data ); } 
);

当然,这会导致以下错误:

XMLHttpRequest无法加载http://cloud.hartwig-at.de/~oliver/superuser.json。 Access-Control-Allow-Origin不允许来源http://superuser.com。

在读取Origin'url'后,我无法通过Access-Control-Allow-Origin(其他问题)解决此问题。 所以,这是下一个版本:

$.get( "http://cloud.hartwig-at.de/~oliver/superuser.json", 
       function( data ) { console.log( data ); }, 
       "jsonp" 
);

可悲的是,这导致了另一个错误:

未捕获的SyntaxError:意外的标记:(superuser.json:2)

还有一个警告告诉我“资源被解释为脚本,但是通过MIME类型text / plain传递:”这已经给了我一个想法是什么麻烦。 (Chrome提供了更多的细节,“资源被解释为脚本,但是通过MIME类型text / plain传输”,是什么给出的?)

显然,HTTP服务器必须为我的文件发送适当的MIME类型,这将是application/json

好吧,所以我很快将所需的更改添加到了我的mime.types并继续前进。 但是,没有骰子! 警告消失了,错误没有。 我仍然得到Uncaught SyntaxError: Unexpected token : 。 (我以前也曾试图利用mimeType参数来解决这个问题,结果是一样的。)

虽然MIME类型看起来不错:

现在我有点不知道了。 .json文件的内容在http://www.jslint.com/上可以很好地验证


除非服务器支持,否则您不能在请求上使用JSONP。 JSONP调用工作的方式是,在请求和服务器之间传递callback=something参数,服务器使用something()封装JSON,以便在访问脚本时通过调用something来加载浏览器。

如果你拥有这个域,另一种方法是使用该服务器来正确设置CORS头。

如果您无法访问服务器,请考虑使用JSONP代理,该代理为您打包了第一步。 我已经使用YQL来做到这一点(请参阅链接),这并不需要我自己设置任何东西。 下面是咖啡代码,它可以做到这一点:

uri = "http://cloud.hartwig-at.de/~oliver/superuser.json"      

jqxhr = $.getJSON 
  "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" 
    + encodeURIComponent(uri) + "%22&format=json&callback=?"  

jqxhr.success (yql) ->
  unless yql.query.results
    alert("Failed to get stuff")
    return      
  json = $.parseJSON(yql.query.results.body.p)
  # do stuff with json

并以javascript的形式使用http://js2coffee.org:

uri = "http://cloud.hartwig-at.de/~oliver/superuser.json";

jqxhr = $.getJSON("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22"
        + encodeURIComponent(uri) + "%22&format=json&callback=?");

jqxhr.success(function(yql) {
  var json;
  if (!yql.query.results) {
    alert("Failed to get stuff");
    return;
  }
  json = $.parseJSON(yql.query.results.body.p);
  // do stuff with json
});

告诉jQuery可以做JSONP不会神奇地使它工作。 它发出JSONP请求,但另一端的服务器需要支持JSONP调用。

服务器的响应应该看起来像这样

someFunction( { "foo" : "bar" } );

查看带有JSONP的getJSON的jQuery文档,以了解如何使用回调

如果是现代浏览器,则可以使用CORS,并且可以控制第二个域。

其他选项是您域中的服务器端代理,用于请求来自其他域的数据。 或者你可以使用像雅虎管道这样的服务。

链接地址: http://www.djcxy.com/p/45971.html

上一篇: How do you properly and reliably load JSON data cross

下一篇: Parsing JSON result from Google Places API