使用 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,但还有另一个答案叫做CORSCross-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 没有响应的主要内容,如果未能解决你的问题,请参考以下文章

MediaWiki API 和编码

使用 mediawiki API 按原样显示***页面

使用 mediawiki api 上传文件需要哪些权限?

如果使用 SendGrid API,则禁用 PHP mail() 函数

如何更改 MediaWiki 工具栏图标?

MediaWiki使用指南