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