【问题标题】:Problems reading json data with jquery.使用 jquery 读取 json 数据时出现问题。
【发布时间】:2011-08-17 02:24:30
【问题描述】:

我在使用 jquery 从位于与我的客户端代码所在的不同子域的 Web 服务中获取 json 数据时遇到问题。当我从本地文本文件访问完全相同的 json 数据时,我的代码工作正常。

json数据来自这个地址

var jsonFeed = https://crm.bmw.ca/webservices/RetailerLocator.ashx?language=en&callback=?

数据的MIME类型是text/html,不过我也试过application/json。

这是一种访问方法

$.getJSON(jsonFeed, function (data) {
    $.each(data, function (i, item) {
        alert(item);
    });
});

我也尝试过这种方法,但返回解析器错误。我也尝试过使用 jsonp 数据类型

$.ajax(jsonFeed, {
    crossDomain: true,
    dataType: "json",
    success: function (data, text) {
        $.each(data, function (i, item) {
            alert(item);
        });
    },
    error: function (request, status, error) {
        alert(status + ", " + error);
    }
});

我的代码必须完全是客户端,所以现在不能选择代理。

可以在此处找到具有非常相似问题的人的示例。 jQuery AJAX JSON dataType Conversion

【问题讨论】:

    标签: javascript jquery json cross-domain jsonp


    【解决方案1】:

    您只能在可能的范围内工作。同源策略不能被破坏,尽管您可以在每台服务器上使用跨域策略标头之类的东西将它们基本上链接在一起。但是,这仅在较新的浏览器中受支持,并且您必须控制网络中的所有服务器。

    请参阅:http://en.wikipedia.org/wiki/Same_origin_policy,了解有关您面临的问题的更多信息。

    【讨论】:

      【解决方案2】:

      虽然返回的 JSON 数据可能应该是 text/json 类型,但更大的问题是 API 调用不尊重您的“回调”参数。由于您要跨域调用 API,因此您必须使用 JSONP,这意味着您的数据应该在函数调用中返回。例如,如果您导航到 https://crm.bmw.ca/webservices/RetailerLocator.ashx?language=en&callback=mycallback,您应该会看到返回如下内容:

      mycallback([{"RetailerID":1110,"Name":"BMW St. John's","Address":"120 Kenmount Road"...)

      “回调”参数中指定的回调函数名称未显示为返回数据的一部分这一事实可能意味着您为该参数使用了不正确的名称。或者,可能是系统未配置为允许跨域请求。您应该联系系统管理员并确保 API 允许跨域请求,并检查该 API 的文档并确保您使用了正确的回调参数名称。

      【讨论】:

      • 谢谢乔,我会将其发送给该网络服务的管理员。
      • 好吧,我不知道他们做了什么,但是 Web 服务现在可以正确响应 JSONP 回调请求。所以我的代码很好,只需要服务器尊重请求。
      • 他们肯定解决了导致 JSON 填充函数无法输出的任何问题。祝项目顺利!
      【解决方案3】:

      据我玩 JSFiddle (http://jsfiddle.net/CEDB5/) 所知,您提到的问题/答案是正确的:除非 crm.bmw.ca 开始发送正确的 MIME 类型,否则您会被卡住.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多