2011-05-18 60 views
25

所以我想做出堆栈交易所API的请求与以下jQuery代码:JSONP请求返回错误:“未捕获的SyntaxError:意外的标记:”

$.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! 

我没有一个线索是怎么回事。我知道堆栈交换API Gzips其反应,这会造成麻烦吗?

+0

你从服务器得到什么:从调用URL

结果?我得到了JSON - 而JSON不是JSON-P,它将数据封装在一个回调函数中,该回调函数必须位于全局名称空间中,以及您在请求中告诉服务器的内容(在代码中看不到的其他内容)。关键是,只是不要告诉你的jQuery结果是JSONP,如果它真的是JSON。 – 2011-05-18 14:06:48

+3

我使用JSONP是因为它是在StackOverflow的其他地方提出的。当我使用JSON时,出现以下错误:XMLHttpRequest无法加载http://api.stackoverflow.com/1.1/stats。 Origin-null不被Access-Control-Allow-Origin所允许。“ – theabraham 2011-05-18 14:08:33

+0

不知道他们的API,但是正如我所说的那样,从那个URL清楚地返回的是JSON。使用“dataType”你只告诉你的jQuery *如何解释结果,你不告诉* server *你想要JSONP。 – 2011-05-18 14:11:16

回答

20

你必须设置一个非常规参数才能使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标签不受此限制。这意味着您可以在调用URL的文档中插入script标签。如果您在脚本中定义了全局可访问的函数,并告诉远程服务器该函数被调用的是什么,那么服务器可以传递包含要在调用该函数时发送的数据的代码。

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

+1

“jsonp”是参数 - 但它的值是一个全局命名空间中的函数的名称,一旦结果被调用,该函数将被调用。 – 2011-05-18 14:15:38

+0

这可以工作,但是您能否简要解释原因? – theabraham 2011-05-18 14:16:10

+0

正如我所说,看到你的问题的评论,你必须告诉服务器,你想要JSONP,或者它给你发送JSON!如何取决于服务器,这个需要一个带有回调函数名称的参数“jsonp”。 – 2011-05-18 14:17:30

4

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

“呼我”是你的回调函数的名称 - 在你的全局命名空间(窗口对象)。

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

callme({ 
    "statistics": [ 
... 
    ] 
}) 
相关问题