jQuery .ajax调用bit.ly返回IE中的结果但​​不返回FF或Chrome

我试图使用带有.ajax调用的jQuery来调用bit.ly URL缩短服务。

更新我想知道这是否是跨域安全问题? 我正在从mysite.com打电话到bit.ly

    jQuery.fn.shorten = function(url) { var resultUrl = url; $.ajax( { url: "http://api.bit.ly/shorten?version=2.0.1&login=twipler&apiKey=R_4e618e42fadbb802cf95c6c2dbab3763&longUrl=" + url, async: false, dataType: 'json', data: "", type: "GET", success: function (json) { resultUrl = json.results[url].shortUrl; } }); return resultUrl; } ;   Shorten   

这适用于IE8,但在FireFox(3.5.9)和Chrome中都不起作用。 在这两种情况下,’json’都是null。

IE8中的标题

 GET http://api.bit.ly/shorten?ver..[SNIP]..dtotheinternet.com HTTP/1.1 Accept: application/json, text/javascript, */* Accept-Language: en-US Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30729) Host: api.bit.ly Connection: Keep-Alive 

Chrome中的标题

 GET http://api.bit.ly/shorten?versio..[SNIP]..nectedtotheinternet.com HTTP/1.1 Host: api.bit.ly Connection: keep-alive User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1045 Safari/532.5 Origin: file:// Accept: application/json, text/javascript, */* Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

所以唯一明显的区别是Chrome正在发送“Origin:file://”并且我不知道如何阻止它这样做。

使用Fiddlervalidation请求的实际有效负载和bit.ly服务的响应。 将IE请求/响应与Chrome浏览器进行比较以确定不同之处。

我的(疯狂)猜测是,当Firefox和Chrome发送请求时,由于浏览器发出请求的方式不同,该服务会向您返回错误消息。 特别是,你添加url参数的方式对我来说似乎有些怀疑,我会对它进行编码以防万一。

更新:确实HTTP标头已经揭示了这个问题。 🙂

当用户代理想要建议网站请求是跨源请求时,将添加Origin头 。 显然, Chrome最近添加了对此标题的支持 。 而且当然:

Origin标题的详细信息仍在最终确定中。 我们将根据Mozilla以及W3C和IETF社区的反馈,随着规范的发展,更新Google Chrome中的实施。

可能会发现您目前无法阻止Chrome发送该标头。 顺便说一句,看起来Origin头是由Firefox 3.6首次引入的,我怀疑你是那些运行所有最新和最好的浏览器的人之一。 🙂

顺便说一句, XMLHttpRequest确实有跨域限制。 所以,我想知道jQuery.Ajax是不是在IE8上使用新的XDomainRequest而不是XMLHttpRequest

但回到你的问题 – 在这一点上,所有指向可用的唯一解决方案是对你的站点进行Ajax调用并从你的服务器进行bit.ly调用。 不是最佳,我知道……

让它工作的快速而懒惰的方法是使用JSONP。

 $.ajax( { url: Request, async: false, dataType: 'jsonp', data: "", type: "GET", success: function (json) { console.log(json.data.url); } }); 

应该在一切工作。