使用 jQuery 的 MediaWiki API 没有响应
Posted
技术标签:
【中文标题】使用 jQuery 的 MediaWiki API 没有响应【英文标题】:No response from MediaWiki API using jQuery 【发布时间】:2011-04-21 21:05:51 【问题描述】:我尝试从 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
我得到了预期的内容。怎么了?
【问题讨论】:
【参考方案1】:执行 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);
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
【讨论】:
【参考方案2】:正如其他答案所指出的,您正在发出跨域请求。
现在有效并且他们都给出的一个答案是使用JSONP
而不是JSON
,但还有另一个答案叫做CORS
Cross-origin resource sharing。
然而,尽管 MediaWiki 支持 CORS,但由于它与 Wikipedia 缓存工作方式之间的微妙关系,它尚未在 Wikipedia 上启用。
在 Wikipedia 中有一个开放的错误报告来解决这个问题:Enable $wgCrossSiteAJAXdomains for wikimedia sites。
一旦这个问题得到解决,您将能够向***发出跨域 AJAX 请求,而无需来自支持 CORS 的浏览器的 JSONP。所有主流浏览器的最新版本现在都支持 CORS。对于 Internet Explorer,这意味着没有多少人在运行的版本 10。版本 9 有一个名为 xdomainrequest 的替代解决方案,但并没有受到太多欢迎。
【讨论】:
【参考方案3】:您需要通过在查询字符串上添加&callback=?
来使用$.getJSON()
触发JSONP 行为,如下所示:
$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json&callback=?", function(data)
doSomethingWith(data);
);
You can test it here.
如果不使用 JSONP,您会遇到阻止 XmlHttpRequest 取回任何数据的 same-origin policy。
【讨论】:
非常感谢您制作了如此简单的小提琴。我已经敲了几个小时了,你简单的东西让我点击了。谢谢。 我测试了好几个小时,想知道为什么即使jsonlint.com 说它是一个有效的请求,它也不起作用。谢谢! 这不再起作用了。这是我发现搜索***的唯一方法:jsfiddle.net/tqeL3od2【参考方案4】:如果您从另一个域获取数据,则需要使用getJSONP
,它是“same origin policy”的一部分。
编辑
实际上正如尼克所说,在查询字符串的末尾拍&callback=?
以调用getJSONP
。
【讨论】:
没有$.getJSONP()
:)以上是关于使用 jQuery 的 MediaWiki API 没有响应的主要内容,如果未能解决你的问题,请参考以下文章