2011-08-16 21 views
0

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

JSON数据是从该地址

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

的MIME类型的数据是text/html的到来,但我自己也尝试应用/ JSON。

下面是访问

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

的一个方法,我也试过这种方法,它带回来一个parsererror。我也试图与一个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

回答

0

虽然返回的JSON数据可能应该是text/json类型,但更大的问题是API调用不能遵守“回调”参数。由于您在调用API跨域,所以您必须使用JSONP,这意味着您的数据应该在函数调用中返回。例如,如果您导航到https://crm.bmw.ca/webservices/RetailerLocator.ashx?language=en&callback=myCallBack函数你应该看到这样的事情返回:

myCallBack函数( [{ “RetailerID”:1110, “名”: “宝马圣约翰”, “地址”: “Kenmount Road 120”...

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

+0

感谢乔,我会将此发送到该Web服务的管理员。 – deftoneYo

+0

嗯,我不知道他们做了什么,但Web服务现在正确响应JSONP回调请求。所以我的代码很好,只需要服务器来尊重请求。 – deftoneYo

+0

他们肯定解决了导致JSON填充函数不被输出的问题。项目祝你好运! –

1

你只能在可能的范围内工作。同源策略不能被破坏,尽管您可以在每台服务器上使用跨域策略头等内容,从而将它们实际上链接在一起。但是,这只在较新的浏览器中才支持,并且您必须控制网络中的所有服务器。

请参阅:http://en.wikipedia.org/wiki/Same_origin_policy欲了解更多关于你对抗的信息。

0

就我从使用JSFiddle(http://jsfiddle.net/CEDB5/)所得到的情况来看,您提到的问题/答案是正确的:除非crm.bmw.ca开始发送正确的MIME类型,否则卡住。