14

我试图从 Wikipedia 获取一些 JSON 格式的内容:

$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json", function(data) {
    doSomethingWith(data);
});

但我没有得到任何回应。如果我粘贴到浏览器的地址栏,比如

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles=jQuery&format=json

我得到了预期的内容。怎么了?

4

4 回答 4

31

您需要$.getJSON()通过添加&callback=?查询字符串来触发 JSONP 行为,如下所示:

$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json&callback=?", function(data) {
    doSomethingWith(data);
});

你可以在这里测试它

如果不使用 JSONP,您将遇到阻止 XmlHttpRequest 取回任何数据的同源策略。

于 2010-10-06T14:39:05.937 回答
3

正如其他答案所指出的,您正在发出跨域请求。

现在有效并且他们都给出的一个答案是使用JSONP而不是JSON,但是还有另一个答案称为CORS 跨域资源共享

然而,尽管 MediaWiki 支持 CORS,但由于它与 Wikipedia 缓存工作方式之间的细微差别,它尚未在 Wikipedia 上启用。

有一个开放的错误报告可以在 Wikipedia 中使用:Enable $wgCrossSiteAJAXdomains for wikimedia sites

解决此问题后,您将能够向 Wikipedia 发出跨域 AJAX 请求,而无需来自支持 CORS 的浏览器的 JSONP。所有主流浏览器的最新版本现在都支持 CORS。对于 Internet Explorer,这意味着没有多少人在运行的版本 10。的替代解决方案,它并没有获得太多的欢迎。

于 2012-03-12T09:06:41.863 回答
0

getJSONP如果您从另一个域获取数据,则需要使用它,它是“同源策略”的一部分。

编辑

实际上尼克所说的,&callback=?在你的查询字符串的末尾拍打调用getJSONP

于 2010-10-06T14:39:03.550 回答
0

执行 CORS 请求而不是 JSONP 的一种选择是origin=*在请求 url 中显式包含参数,例如:

var title = "jQuery";

$.getJSON("https://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json&origin=*", function(data) {
    console.log(data.query.pages);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

于 2017-12-09T15:02:26.470 回答