【问题标题】:Get JSON(P) from other site [duplicate]从其他站点获取 JSON(P) [重复]
【发布时间】:2015-10-22 22:10:57
【问题描述】:

我正在尝试使用 Ajax 获取数据。 数据是json。我使用jqueryangular

但结果是未定义或错误。

这是我的 jquery 代码:

$(document).ready(function() {
      var url = "http://market.dota2.net/history/json/";

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

在 Angular 中,我使用的是 jsonp 方法。怎么了?

顺便说一句,在纯 Java 中我可以从这个 url 获取数据...

【问题讨论】:

  • 您确实了解 JSON 和 JSONP 之间的区别,对吧?您的示例中的 URL返回 JSONP。
  • contentType: "application/json", — 您正在发出 GET 请求,您没有请求正文来描述其内容类型。

标签: javascript jquery json angularjs jsonp


【解决方案1】:

如果您希望使用 json,请不要使用 jsonp,而是使用 json

$(document).ready(function() {
      var url = "http://market.dota2.net/history/json/";

      $.ajax({
           type: 'GET',
            url: url,
            async: true, /* it fails with false */
            contentType: "application/json",
            dataType: 'json',/* <== here */
            success: function(data) {
              console.log(data);
            }
        });
    });

您是否有意识地使用jsonp?你知道这是什么吗 ?如果没有,请使用json。或了解JSonP:https://en.wikipedia.org/wiki/JSONP


我在 Safari:works 上试过。

在 Chrome 和 FFox 上:不起作用 + Erreur“跨域来源”

XMLHttpRequest 无法加载 http://market.dota2.net/history/json/。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'null'。

这意味着您无法从 API 服务器获取带有客户端/机器的 JSON。所以你确实应该使用JSonP,但是......你错过了API文档中的回调或其他内容。

【讨论】:

    【解决方案2】:

    怎么了?

    您正在尝试调用提供 JSON 的端点,就好像它提供了 JSONP。那是行不通的;它们是不同的(尽管相关)格式。

    例如JSON:

    {"foo":"bar"}
    

    例如JSONP:

    callback({"foo":"bar"})
    

    注意区别:JSONP 实际上是一个 JavaScript 函数调用,包裹在 JSON 上。

    如果 API 支持 JSONP,请调用支持它的端点。

    如果没有,除非提供者支持 Cross-Origin Resource Sharing 并与您的来源共享,否则您无法直接查询它,因为 Same Origin Policy 适用于 ajax 调用。

    顺便说一句,在纯 Java 中我可以从这个 url 获取数据...

    因为 Java 代码不在由 SOP 控制的上下文中运行,因此可以从该端点(作为 JSON)获取数据并使用它。这也是将 URL 发布到浏览器地址栏中让我们看到数据的相同原因。但 ajax 调用受更严格的规则管理。

    【讨论】:

      猜你喜欢
      • 2019-05-13
      • 2012-05-01
      • 2014-04-16
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多