2011-05-18 64 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": [ 
... 
    ] 
}) 
相關問題