使用jsonp访问stackoverflow API会产生意外结果

时间:2012-11-12 21:27:05

标签: ajax api jsonp

我试图以jsonp作为数据类型访问Stackoverflow API:

$(document).ready(function(){
        $.ajax({
          url: 'http://api.stackoverflow.com/1.1/tags/php/top-answerers/month',
          dataType: 'jsonp',
        });
      });

一旦我重新加载,我在控制台中得到以下内容:

"Uncaught SyntaxError: Unexpected token :"

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

来自https://api.stackexchange.com/docs

  

所有API响应都是JSON,我们使用回调查询参数支持JSONP。 API中的每个响应都在一个通用的“包装器”对象中返回,以便更容易和更一致地进行解析。

因此,您应该使用dataType: 'json'而不是jsonp

您还应该升级到2.1 API,1.x API已被弃用6个月。

答案 1 :(得分:0)

现在,应用程序返回Content-Type:application/json

您可以通过将回调函数名称覆盖到jsonp来解决此问题,这将告诉服务器返回Content-Type:application/javascript

$(document).ready(function () {
    $.ajax({
        url: 'http://api.stackoverflow.com/1.1/tags/php/top-answerers/month',
        dataType: 'jsonp',
        jsonp: 'jsonp',
        success: function (data) {
            alert(data.top_users.length + ' users retrieved.');
        }
    });
});

有关jsonp ajax设置的信息:

  

<强> jsonpString

     

覆盖jsonp请求中的回调函数名称。这个值   将在'callback =?'中使用而不是'callback'的一部分   在url中查询字符串。所以{jsonp:'onJSONPLoad'}会导致   'onJSONPLoad =?传递给服务器。从jQuery 1.5开始,设置   jsonp选项为false可防止jQuery添加“?回调”   字符串到URL或尝试使用“=?”转型。在   在这种情况下,您还应该显式设置jsonpCallback设置。   例如,{jsonp:false,jsonpCallback:“callbackName”}