我遇到了JSON跨域策略问题。经过一些实验,我能够使这段代码正常工作,但我遇到的情况是,我有两段代码看起来应该完全一样,但只有一段有效。
我正在访问的JSON在这里
http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json
这个文件似乎很简单JSONP:它不带任何参数,而JSON用一个名为jsonCallBack的函数调用填充。它似乎是有效的JSON。
这是我尝试用来获取此JSON数据的第一组代码:
$.getJSON("http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json?callback=jsonCallback", function (data) {
//This will not alert
alert(data.APHNonStopProducts.Carpark[0].Airport.airportcode);
});
我的理解是你可以用函数包装器的名称替换callback=?
,以便将数据传递给匿名函数。此代码在Chrome开发工具中显示以下错误:
XMLHttpRequest无法加载 http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json?callback=jsonCallback。 来源http://fiddle.jshell.net不被允许 访问控制允许来源。
值得注意的是,如果将URL保留为aphnonstopproductsjson.json?callback=?
并且在我的代码中存在已命名的函数,则会正确检索数据并调用命名函数(尽管匿名函数仍然不是)
这是第二个有效的代码:
$.ajax({
url: "http://www.aph.com/files/partners/aphnonstopproducts/json/aphnonstopproductsjson.json?callback=?",
dataType: 'json',
jsonp : "callback",
jsonpCallback: "jsonCallback",
success: function(data) {
//This alert will fire
alert(data.APHNonStopProducts.Carpark[0].Airport.airportcode);
}
});
});
在这个调用中,我指定参数名称应该是回调函数,函数名称应该是jsonCallback。所以从本质上讲,是不是和第一个代码一样?如果是这样,为什么第一个代码会失败?
在这里查看两段代码:http://jsfiddle.net/3EXca/(您应该收到一条提示“ABZ”的警告)
答案 0 :(得分:1)
问题是服务器不能正确支持JSONP。没有回调参数,就不应该有回调。相反,它已经有一个jsonCallback。可能有一种方法可以覆盖它,但我无法猜测参数。
对于$.getJSON
使用JSONP,服务器必须支持带有一些回调参数名称的JSONP。
第二个有效,因为你强迫jQuery使用函数名jsonCallback
。的:
jsonp: 'callback'
无关紧要,因为它始终包含jsonCallback
。