25

因此,我尝试使用以下 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 会压缩它的响应,这会造成什么麻烦吗?

4

2 回答 2

21

您必须设置一个非常规参数才能使 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参数。

于 2011-05-18T14:11:53.257 回答
4

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

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

顺便说一句,如果您正在运行 Firefox 并安装了 JSONView 插件,您可以直接测试上面的 URL(以及您的 URL 以进行比较)。

调用 URL 的结果:

callme({
  "statistics": [
...
  ]
})
于 2011-05-18T14:12:49.167 回答