2011-11-13 58 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/