0

我在 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。Access-Control-Allow-Origin 不允许来源http://fiddle.jshell.net 。

值得注意的是,如果保留 URLaphnonstopproductsjson.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”的警报)

4

1 回答 1

1

问题是服务器不正确支持 JSONP。没有回调参数,就不应该有回调。相反,它已经有一个 jsonCallback。可能有一种方法可以覆盖它,但我无法猜测参数。

为了$.getJSON使用 JSONP,服务器必须支持带有一些回调参数名称的 JSONP。

第二个有效,因为您强制 jQuery 使用函数 name jsonCallback。这:

jsonp: 'callback'

没关系,因为jsonCallback无论如何它总是包裹着。

于 2012-04-17T15:00:22.247 回答