代码之家  ›  专栏  ›  技术社区  ›  Dead account

jquery.ajax对bit.ly的调用返回的结果是ie,而不是ff或chrome

  •  3
  • Dead account  · 技术社区  · 15 年前

    我尝试使用jquery和.ajax调用来调用bit.ly URL缩短服务。

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

    <html><head>
    <script type="text/javascript" src="http://www.twipler.com/settings/scripts/jquery.1.4.min.js"></script>
    <script type="text/javascript">
    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;
    } ;
    </script></head><body>
    <a href="#" 
          onclick="alert($().shorten('http://amiconnectedtotheinternet.com'));">
          Shorten</a>   </body>    </html>
    

    这在IE8中有效,但在火狐(3.5.9)和Chrome中都不起作用。在这两种情况下,“json”都为空。

    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
    

    铬合金表头

    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://”,我不知道如何阻止它这样做。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Franci Penov    15 年前

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

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

    更新: 因此,HTTP头确实揭示了这个问题。-)

    这个 Origin header 当用户代理想要建议网站请求是跨源请求时,由用户代理添加。显然 Chrome has added support 最近的邮件头。当然:

    原始标题的详细信息为 仍在定稿。我们将更新 在Google Chrome AS中的实现 规范的发展基于 来自Mozilla和W3C的反馈 以及IETF社区。

    结果可能是您当前无法阻止chrome发送该头文件。顺便说一句,似乎 Origin header最初是由firefox 3.6引入的,我怀疑你是那些运行所有最新和最好浏览器的人之一。-)

    顺便说一句, XMLHttpRequest 有跨域限制。所以,我想知道jquery.ajax是否没有使用 XDomainRequest 在IE8而不是 对象 .

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

        2
  •  1
  •   Chris McKee    15 年前

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

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

    什么都可以。

    推荐文章