我试图从维基百科获取一些内容为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
我得到了预期的内容。怎么了?
答案 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);
});
在不使用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有一个名为xdomainrequest的替代解决方案,并没有得到太多的普及。
答案 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);
});