Javascript 如何正确可靠地跨站点加载JSON数据?
我目前正在为Chrome开发一个userscript/扩展,并试图从“某个网站”中获取一些JSON数据。这就是我的方法:Javascript 如何正确可靠地跨站点加载JSON数据?,javascript,jquery,json,jsonp,Javascript,Jquery,Json,Jsonp,我目前正在为Chrome开发一个userscript/扩展,并试图从“某个网站”中获取一些JSON数据。这就是我的方法: $.get( "http://cloud.hartwig-at.de/~oliver/superuser.json", function( data ) { console.log( data ); } ); 当然,这会导致以下错误: 无法加载XMLHttpRequest。访问控制不允许原点允许原点 我在阅读后(以及其他问题)能够解决这个问题。这是下一个版
$.get( "http://cloud.hartwig-at.de/~oliver/superuser.json",
function( data ) { console.log( data ); }
);
当然,这会导致以下错误:
无法加载XMLHttpRequest。访问控制不允许原点允许原点
我在阅读后(以及其他问题)能够解决这个问题。这是下一个版本:
$.get( "http://cloud.hartwig-at.de/~oliver/superuser.json",
function( data ) { console.log( data ); },
"jsonp"
);
不幸的是,这导致了另一个错误:
未捕获的语法错误:意外标记:(superuser.json:2)
还有一条警告告诉我“资源被解释为脚本,但使用MIME类型text/plain传输:”这已经让我知道了问题可能是什么。(更多详细信息通过提供)
显然,对于我的档案来说,那是
好的,所以我很快添加了我的mime.types
,然后又进行了一次尝试。但是,没有骰子!警告消失了,错误没有消失。我仍然得到未捕获的语法错误:意外标记:
。(我之前也曾尝试利用解决方案来解决这个问题,结果是一样的。)
MIME类型看起来不错:现在我有些不知所措了。
.json
文件的内容在告诉jQuery的get to do JSONP并不能神奇地使其工作时,验证了fine。它会产生错误,但另一端的服务器需要支持JSONP调用
来自服务器的响应应该类似于
someFunction( { "foo" : "bar" } );
请参阅with JSONP以了解如何使用回调
如果它是一款现代浏览器,您可以使用它,并且您可以控制第二个域
另一个选项是域上的服务器端代理,它从另一个域请求数据。或者您可以使用类似的服务 告诉jQuery的get to do JSONP并不能神奇地让它工作。它会产生错误,但另一端的服务器需要支持JSONP调用 来自服务器的响应应该类似于
someFunction( { "foo" : "bar" } );
请参阅with JSONP以了解如何使用回调
如果它是一款现代浏览器,您可以使用它,并且您可以控制第二个域
另一个选项是域上的服务器端代理,它从另一个域请求数据。或者您可以使用类似的服务 除非服务器支持,否则不能对请求使用JSONP。JSONP调用work的方式是,您将
callback=something
参数与请求一起传递,服务器使用something()
封装JSON,以便在访问脚本时,浏览器可以通过调用something
加载它
另一种使其工作的方法是,如果您拥有该域,则配置该服务器以正确设置CORS头
如果你没有访问服务器,考虑一下,它为你包装了第一步。我已经使用YQL来实现这一点(参见链接),这不需要我自己设置任何东西。下面是执行此操作的coffeescript代码:
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的形式使用:
除非服务器支持,否则不能对请求使用JSONP。JSONP调用work的方式是,您将
callback=something
参数与请求一起传递,服务器使用something()
封装JSON,以便在访问脚本时,浏览器可以通过调用something
加载它
另一种使其工作的方法是,如果您拥有该域,则配置该服务器以正确设置CORS头
如果你没有访问服务器,考虑一下,它为你包装了第一步。我已经使用YQL来实现这一点(参见链接),这不需要我自己设置任何东西。下面是执行此操作的coffeescript代码:
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的形式使用:
以返回正确jsonp的服务器端脚本(asp、php等)为目标,或者使用静态回调并告诉jQuery使用它。如果你不知道我在说什么,就研究一下jsonp是什么。jsonp涉及json,但它们不是同一个。针对返回正确jsonp的服务器端脚本(asp、php等),或者使用静态回调并告诉jQuery使用它。如果你不知道我在说什么,就研究一下jsonp是什么。jsonp涉及json,但它们不是一个,这就解释了很多“告诉jQuery的get to do JSONP并不能神奇地让它工作”,这解释了很多;)使用中概述的YQL方法可以让我快速解决这个问题。谢谢。我发布了我自己的代码,因为如果我没记错的话,在这个问题上使用一字不差的代码对我不起作用。作为将来的参考,在使用YQL时,最好也通过,以避免有损数据转换。在我的例子中,省略参数会导致JSON对象中的键在包含某些字符时发生更改。谢谢。我发布了我自己的代码,因为如果我没记错的话,在这个问题上使用一字不差的代码对我不起作用。作为将来的参考,在使用YQL时,最好也通过,以避免有损数据转换。在我的例子中,省略参数会导致JSON对象中的键在包含某些字符时发生更改。