【问题标题】:Retrieve JSON data from remote URL via jQuery AJAX通过 jQuery AJAX 从远程 URL 检索 JSON 数据
【发布时间】:2013-08-21 05:29:22
【问题描述】:

我正在使用以下代码从 URL 获取数据。

$.ajax({
    url: 'http://183.77.251.173:90/api/function/getprice.aspx?code=1301&length=3M',
    success: function (data) {
        alert(data.results[0].address_components[0].long_name);
    },
    error: function (jqXHR, exception) {
        alert(jqXHR.status);
    }

但是它会抛出状态代码为0 的错误。我不知道这是什么原因?我也尝试设置crossDomian:true,但仍然抛出同样的错误。

我还将 URL 修改为http://www.google.com,这也返回了0 的错误状态代码。为什么?是什么原因?从远程 URL 获取数据的正确方法是什么?

【问题讨论】:

标签: javascript ajax jquery cross-domain


【解决方案1】:

除非您使用 JSONP 或 CORS,否则您无法发出跨域请求。它们的可用性将取决于您从中请求信息的域的 API。

这是现代浏览器的一项安全功能,称为Same Origin Policy

【讨论】:

  • 我如何知道可用性?
  • 您需要查看您使用的 API 的文档,以了解它们返回数据的格式。
【解决方案2】:

查找带有填充(或 JSONP)的 JSON,由于您使用 jQuery,您应该在这里查看:http://api.jquery.com/jQuery.getJSON/

从该网站窃取的示例:

<script>
(function() {
  var flickerAPI = "http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?";
  $.getJSON( flickerAPI, {
    tags: "mount rainier",
    tagmode: "any",
    format: "json"
  })
  .done(function( data ) {
    $.each( data.items, function( i, item ) {
      $( "<img/>" ).attr( "src", item.media.m ).appendTo( "#images" );
      if ( i === 3 ) {
        return false;
      }
    });
  });
})();
</script>

编辑:

自制示例,使用 jquery.jsonp-2.4.0 获得更好的错误响应 (https://github.com/jaubourg/jquery-jsonp/downloads)。但是你也可以使用普通的 jQuery。

在客户端,你需要这样的东西:

$.jsonp({
    "url": target_url+"ping.php?callback=?",
    "success": function(data) {
        // print out data
    },
    "error": function(d,msg) {
        // error
    }
});

目标服务器上的ping.php文件:

<?php
    echo $_GET['callback'] . '(' . "{'response' : 'success'}" . ')';
?>

【讨论】:

  • 请注意,指定 URL 的站点必须支持 JSONP 才能正常工作。 OP 指定的特定 URL (183.77.251.173:90/api/function/…) 返回 JSON,尽管该站点可能有某种方式来请求 JSONP。
  • @nnnnnn 你能更新更清晰的细节吗?我不知道什么是 JSONP 和相同的 -orrigin 政策
  • 如果您可以访问目标服务器,您可以尝试我添加到答案中的示例。如果您无权访问服务器,则需要询问他们是否支持 JSONP,然后相应地更改您的代码。
【解决方案3】:

正如其他人所说,您收到错误 0 是因为该站点无法访问。跨站问题是一个原因。当然,不正确的 URL 也是如此。如果您尝试访问的 URL 确实有效并且与您的站点位于不同的域中,那么是的,您遇到了跨域问题。

JSONP 将是你让它工作的唯一方法,但也有缺点。请查看 SO 上的这篇文章以获得详细说明:

What is JSONP all about?

文章中还有一个指向http://www.json.org/JSONRequest.html 的链接。我还没有尝试过,所以不确定它是否有效。

这应该可以帮助你。

【讨论】:

    【解决方案4】:

    跨域使用$.getJSON()

    $.getJSON('http://183.77.251.173:90/api/function/getprice.aspx?code=1301&length=3M', function(data){
    alert(data.results[0].address_components[0].long_name);
    });
    

    【讨论】:

    • 是的,但是类似的。
    • 一点也不。阅读其他答案以了解原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多