这两个ajax脚本有什么区别?

时间:2012-04-17 14:51:12

标签: jquery ajax json jsonp

我遇到了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”的警告)

1 个答案:

答案 0 :(得分:1)

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

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

第二个有效,因为你强迫jQuery使用函数名jsonCallback。的:

jsonp: 'callback'

无关紧要,因为它始终包含jsonCallback