我正在使用jquery进行ajax调用以获取json格式的数据。调用成功回调函数但数据为空。
$(document).ready(function () {
$.ajax({
url: "http://apps.sungardhe.com/StudentResearch/public/Research.svc/Schools",
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: cbSchools
});
});
function cbSchools(data) {
if (data == null) {
alert("data is null");
return;
}
for (var school in data) {
$("#ddSchool").append("<option value='" + data[school].ShortName + "'>" + data[school].ShortName + "</option>");
}
}
使用fiddler我看到响应实际上是返回json数据,但由于某种原因,jquery结果对象为null。谁能告诉我为什么?
答案 0 :(得分:7)
您被阻止跨域XMLHttpRequests的same-origin policy阻止。由于您需要设置标头以从这样的.Net Web服务中获取JSON,因此您处于困境,您无法通过浏览器发出此类请求,而不是来自其他域。
Fiddler可能正在显示内容,但浏览器不会让页面看到它,出于安全考虑,它总是为空。解决这个问题的方法是JSONP,但不幸的是,它看起来并不像是设置了支持它的服务。
答案 1 :(得分:1)
我相信你可以使你的通话成为通用的(原因如marduk所示)
为了处理这个问题,并使调用通用(适用于data和data.d),我在我的ajax调用中使用以下内容(使用我的asp.net内容),以便它可以与旧服务和新服务一起使用:
dataFilter: function(data)
{
var msg;
if (typeof (JSON) !== 'undefined' &&
typeof (JSON.parse) === 'function')
msg = JSON.parse(data);
else
msg = eval('(' + data + ')');
if (msg.hasOwnProperty('d'))
return msg.d;
else
return msg;
},
编辑:如果它真的是空的而不是“未定义”那么跨域问题可能会在这里发挥作用。
答案 2 :(得分:0)
试试这个
if (data.d == null) {
alert("data.d is null");
return;
}
由于返回数据类型为json,因此数据位于响应对象中的数据“d”变量中。