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

所以我试图用以下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它的响应,这会导致任何麻烦吗?

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

此外,您无法使用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标签不受此限制。 这意味着您可以将script标记插入到调用URL的文档中。 如果在脚本中定义全局可访问的函数并告诉远程服务器调用该函数,则服务器可以传递包含要在调用该函数时发送的数据的代码。

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

试试这个url: http : //api.stackoverflow.com/1.1/stats?jsonp = callme

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

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

调用URL的结果:

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