0

JSONクロスドメインポリシーの問題で問題が発生しています。少し実験した後、このコードを機能させることができましたが、まったく同じであるはずの2つのコードがあり、1つしか機能しないという状況に遭遇しました。

私がアクセスしている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をロードできません。Origin http://fiddle.jshell.netは、Access-Control-Allow-Originでは許可されていません。

URLをそのままaphnonstopproductsjson.json?callback=?にして、名前付き関数がコードに存在する場合、データは適切に取得され、名前付き関数が呼び出されます(ただし、匿名関数はまだ呼び出されません)。

これが機能する2番目のコードです。

$.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 があります。それをオーバーライドする方法があるかもしれませんが、パラメーターを推測できません。

JSONP を使用するには$.getJSON、サーバーが何らかのコールバック パラメータ名で JSONP をサポートする必要があります。

2 番目の方法は、jQuery に関数名の使用を強制しているためですjsonCallback。:

jsonp: 'callback'

とにかく常にラップするので問題ありませんjsonCallback

于 2012-04-17T15:00:22.247 に答える