使用jQuery没有来自MediaWiki API的响应

时间:2010-10-06 14:36:26

标签: jquery json cross-domain response wikipedia-api

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

答案 0 :(得分:30)

您需要通过在查询字符串上添加&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

答案 1 :(得分:3)

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

现在有效且他们同时给出的一个答案是使用JSONP代替JSON,但还有另一个答案称为CORS Cross-origin resource sharing

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

有一个公开的错误报告可以在维基百科中使用它: Enable $wgCrossSiteAJAXdomains for wikimedia sites

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

答案 2 :(得分:0)

如果您从其他域获取数据,则需要使用getJSONP,这是“same origin policy”的一部分。

修改

实际上Nick说的是,在查询字符串的末尾打了&callback=?来调用getJSONP

答案 3 :(得分:0)

执行CORS请求而不是JSONP的一个选项是在请求URL中明确包含参数def create_tokens(*filenames): for filename in filenames: #print('FILE', filename) with open(filename) as file: text = file.read() text = text.translate(no_punct).lower() yield text.split() tokens = list(create_tokens('1.txt','2.txt','3.txt')) print(tokens) ,例如:



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