小编典典

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

ajax

因此,我尝试使用以下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使用Gzip压缩其响应,这会引起任何麻烦吗?


阅读 241

收藏
2020-07-26

共1个答案

小编典典

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

此外,您不能POST使用JSONP。

$.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参数。

2020-07-26