我在使用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);
});
});
我也尝试过这种方法,它带有一个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 :(得分:1)
你只能在可能的范围内工作。尽管您可以在每台服务器上使用跨域策略标头之类的东西来实际将它们链接在一起,但不能破坏同源策略。但是,这只在较新的浏览器中得到支持,您必须控制网络中的所有服务器。
请参阅:http://en.wikipedia.org/wiki/Same_origin_policy了解有关您遇到的问题的更多信息。
答案 1 :(得分:0)
到目前为止我可以通过JSFiddle(http://jsfiddle.net/CEDB5/)来判断,你提到的问题/答案是正确的:除非crm.bmw.ca开始发送正确的MIME类型,否则你会被卡住
答案 2 :(得分:0)
虽然返回的JSON数据可能应该是text / json类型,但更大的问题是API调用不符合您的“回调”参数。由于您正在调用API跨域,因此必须使用JSONP,这意味着您的数据应该在函数调用内返回。例如,如果您导航到https://crm.bmw.ca/webservices/RetailerLocator.ashx?language=en&callback= mycallback ,您会看到返回的内容:
mycallback( [{“RetailerID”:1110,“名称”:“宝马圣约翰”,“地址”:“120 Kenmount Road”...... )
“callback”参数中指定的回调函数名称未显示为返回数据的一部分这一事实可能意味着您对该参数使用了错误的名称。或者,可能是系统未配置为允许跨域请求。您应该联系系统管理员并确保API允许跨域请求,并检查该API的文档,并确保使用正确的回调参数名称。