你如何正确和可靠地加载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