2011-11-13 97 views
1

我正在使用jQuery(1.7.0)對Spotify進行json/ajax調用。以下代碼在Chrome和Firefox中正常工作,但在IE中導致錯誤(錯誤:訪問被拒絕。)。jQuery和Ajax與json - 在IE中失敗

$.ajax({ 
    url: 'http://ws.spotify.com/lookup/1/.json',  
    type: 'GET',  
    dataType: 'json',  
    cache: true,  
    data: {  
     uri: "someartist",  
     extras: "album"  
    },  
    success: successfn,  
    error:function(xhr, status, errorThrown) {  
     alert("networking error: "+errorThrown+'\n'+status+'\n'+xhr.statusText);  
    } 
}); 

成功函數被調用在Chrome和FF,但誤差函數被調用在IE與上述消息。我已將cors設置爲true:jQuery.support.cors = true;

它可以在本地和我的服務器上使用Chrome和FF,它可以在本地但在服務器上運行。更改cache: false導致spotify結束時出現問題 - 不附加其他參數,因此我收到了「錯誤的請求」錯誤。

感謝任何指針。

感謝

阿波

回答

4

你是依靠Spotify的URL給我們Access-Control-Allow-Origin:*在他們的頭,以允許從所有域跨域請求。然而Internet Explorer不支持這一點,所以它拒絕訪問。

access-control-allow-origin解釋。 (TLDR:服務器可能允許在其頭文件中使用跨域Ajax)

如果您需要在IE中使用此工具,那麼可以使用spotify的JSONP API(如果他們有一個)或者在Flash中發出AJAX請求,該請求適用於所有瀏覽器將請求響應數據傳遞給您的JavaScript。

+0

這真的很有用!謝謝。編寫一些PHP來使用curl獲取數據然後將其傳遞給我的javascript是很簡單的嗎?我從來沒有使用閃光燈,我不認爲spotify有一個jsonp接口。 – abonae

+0

你不需要使用flash(除了在頁面上嵌入.swf),你可以使用flXHR幾乎和你使用jsXHR一樣,而不需要跨瀏覽器的差異。閱讀其頁面上的一些文檔,瞭解如何使用API​​。是的,您可以使用您的服務器作爲代理來檢索數據,因爲它位於同一個域中,但這會給您的服務器帶來不必要的負載。 – Esailija

+0

我會試一試 – abonae

0

你可以給返回的數據的例子嗎?

at a/guess /,它或者與文件名「.json」有關,或者返回的JSON有一些奇怪的東西。

0

我很驚訝這適用於Chrome或Firefox。您不應該能夠運行跨域JSON請求。

如果Spotify API支持它,則應使用JSONP訪問其他域中的資源。

另見:No response from jQuery ajax call

+0

感謝您的支持。 Spotify似乎不支持jsonp。據推測,我可以寫一塊PHP,通過curl獲取數據,然後將其返回到相同的域名?php我能夠 – abonae

0

我沒有看到FF這方面的工作。您無法進行跨域Ajax調用。所以我不確定當你說它在FF中工作時發生了什麼。但我只是在FF中嘗試了以下內容,並且出現了錯誤。所以你只能在服務器端進行調用,然後將結果包含在頁面中。

http://jsfiddle.net/2XWGn/

+0

它在FF(和Chrome)中工作。在你放入jsfiddle的例子中,你已經複製了製作的uri字段!如果你嘗試使用真實的(如spotify:album:4neXRfYbkqqdrw3E9Z4wol),則調用成功。 – abonae

+0

http://jsfiddle.net/7VvUS/ – abonae

+0

謝謝您的迴應!今天我學到了重要的東西。 – dnuttle

2

以上關於使用jsonp的回答是正確的;我想補充:

不要設置

jquery.support.cors = true; 

我不知道爲什麼有這麼多的問題要闡明他們採取這一步驟。這個屬性是爲了查明瀏覽器是否支持CORS。如果你知道的不同,你應該只重寫它,並且根據我的經驗,對於所有主流瀏覽器都是準確的。將其設置爲true不會使瀏覽器使用CORS,它只會拒絕CORS將失敗的信息。

http://api.jquery.com/jQuery.support/