【问题标题】:No response from MediaWiki API using jQuery使用 jQuery 的 MediaWiki API 没有响应
【发布时间】: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

我得到了预期的内容。怎么了?

【问题讨论】:

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


    【解决方案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 有一个名为 的替代解决方案,但并没有受到太多欢迎。

      【讨论】:

        【解决方案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() :)
        猜你喜欢
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 2018-05-04
        • 2016-03-02
        • 1970-01-01
        • 2020-08-16
        • 2013-03-08
        • 1970-01-01
        相关资源
        最近更新 更多