JSONP请求返回错误:“未捕获的SyntaxError:意外的令牌:”

时间:2011-05-18 14:03:29

标签: javascript ajax jquery stackexchange-api

所以我尝试使用以下jQuery代码向Stack Exchange API发出请求:

$.ajax({                                                                                                                                                                                                        
    type: 'POST',                                                                                                                                                                                                 
    url: 'http://api.stackoverflow.com/1.1/stats',                                                                                                                                              
    dataType: 'jsonp',                                                                                                                                                                                                
    success: function() { console.log('Success!'); },                                                                                                                                                                                       
    error: function() { console.log('Uh Oh!'); }                                                                                                                                                              
});   

但是当我在我的机器上打开文件,在FireFox或Chrome中,并发出请求时,我收到此错误:

Resource interpreted as Script but transferred with MIME type application/json.
Uncaught SyntaxError: Unexpected token :
Uh Oh!

我不知道发生了什么。我知道Stack Exchange API Gzips它的响应,这会导致任何麻烦吗?

2 个答案:

答案 0 :(得分:21)

您必须设置非常规参数才能使SO API正常工作。而不是传统的callback,您需要传递jsonp参数。

此外,您无法使用JSONP执行POST

$.ajax({                                                                                                                                                                                                        
    type: 'GET',                                                                                                                                                                                                 
    url: 'http://api.stackoverflow.com/1.1/stats',                                                                                                                                              
    dataType: 'jsonp',                                                                                                                                                                                                
    success: function() { console.log('Success!'); },                                                                                                                                                                                       
    error: function() { console.log('Uh Oh!'); },
    jsonp: 'jsonp'                                                                                                                                                
});

使用传统的XMLHTTPRequest无法进行跨域AJAX。这是出于安全原因(它称为同源政策)。

有一种解决方法。 script代码不受此限制。这意味着您可以在调用URL的文档中插入script标记。如果在脚本中定义一个全局可访问的函数并告诉远程服务器调用该函数,服务器可以传递包含要在调用该函数时发送的数据的代码。

您遇到的困难在于StackOverflow API。通常,您可以在请求中使用callback参数,告诉服务器您的函数调用了什么。但是,StackOverflow的API会要求您使用jsonp参数。

答案 1 :(得分:4)

试试此网址:http://api.stackoverflow.com/1.1/stats?jsonp=callme

“callme”是回调函数的名称 - 在GLOBAL NAMESPACE(窗口对象)中。

顺便说一句,如果您运行的是Firefox并安装了JSONView附加组件,则可以直接测试上述URL(以及您的比较)。

调用网址的结果:

callme({
  "statistics": [
...
  ]
})