因此,我尝试使用以下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压缩其响应,这会引起任何麻烦吗?
您必须设置一个非常规参数才能使SO API正常工作。而不是常规的callback,您需要传递一个jsonp参数。
callback
jsonp
此外,您不能POST使用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的文档中插入标签。如果您在脚本中定义了一个全局可访问的函数,并告诉远程服务器该函数的名称,则服务器可以传递将要发送的数据包装起来的代码,以对该函数的调用。
script
您在这里遇到的困难是StackOverflow API。按照惯例,您可以callback在请求中使用参数来告诉服务器您的函数被调用了什么。但是,StackOverflow的API要求您改为使用jsonp参数。