MediaWiki API没有使用jQuery的响应

我试图从维基百科获取一些内容作为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 

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

您需要通过添加&callback=?来触发$.getJSON()的JSONP行为&callback=? 在查询字符串上,像这样:

 $.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获取任何数据的同源策略 。

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

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

然而,尽管MediaWiki支持CORS,但由于它与维基百科的缓存工作之间的微妙之处,它尚未在维基百科上启用。

有一个开放的错误报告,可以在维基百科中使用它: 为维基媒体网站启用$ wgCrossSiteAJAXdomains

一旦解决了这个问题,您就可以向维基百科发出跨域AJAX请求,而无需支持CORS的浏览器使用JSONP。 所有主流浏览器的最新版本现在都支持CORS。 对于Internet Explorer,这意味着版本10并没有很多人在运行。 版本9有一个名为xdomainrequest的替代解决方案,并没有获得太大的普及。

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

编辑

实际上尼克说的是什么,巴掌&callback=? 在查询字符串的末尾调用getJSONP

执行CORS请求而不是JSONP的一个选项是在请求URL中明确包含参数origin=* ,例如:

 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); });