2

javascript と json を勉強していて、別のサーバーから json ファイルを取得する必要があります。ローカルの json ファイルで動作する JavaScript テストをいくつか実行しましたが、別のドメインにあるファイルで作業する必要があるため、すべてのコードを jsonp に変換したいと考えています。私のコードは次のとおりです。

function jsonEntity()
{
 var richiestaEntity = new XMLHttpRequest();

richiestaEntity.onreadystatechange = function()
{
    if(richiestaEntity.readyState == 4) 
{
        var objectentityjson = {};
        window.arrayEntity= []; //creazione dell'array che conterrà le entity
        objectentityjson = JSON.parse(richiestaEntity.responseText);

        arrayEntita = objectentityjson.cards;

    return arrayEntita;
    }
}
richiestaEntity.open("GET", "myjson.json", true);
richiestaEntity.send(null);
}

コードの構造を失うことなく、ローカル json の代わりに jsonp を使用するにはどうすればよいですか?

4

2 に答える 2

4

JSONP と JSON は、バックグラウンドでの動作が根本的に異なります。詳細については、他のスタック オーバーフローの回答を参照してください。

JSONP の仕組みのため、JSON 応答を関数呼び出し (通常、その名前はGET パラメーターによって指定されます)にラップするには、サーバーの協力が必要です。callback

/get_jsonp.php?callback=foo

(すべき) 取得:

foo({
    "foo": "bar"
});

...応答で。

その協力を得たと仮定すると、既存の機能を次のように変更できます。

function jsonEntity()
{
   var callbackName = "ajaxCallback";
   var script = document.createElement("script");

   // This bit needs the cooperation of the server, 
   // otherwise `ajaxCallback` won't be called.
   script.src = "myjson.json?callback=" + callbackName;

   window[callbackName] = function (obj) {
       window.arrayEntity = obj.cards;
   }

   document.body.appendChild(script);
}
于 2012-06-26T09:24:09.810 に答える
1

JSONP は JSON とは動作が異なります。

JSON では、基本的に XHR を使用してサーバーからファイルを要求し、それを解析して、結果のオブジェクトを操作します。

JSONP では、<script>他のサーバーから lib をロードするときのようにタグを挿入します。いくつかの違いがあります。URL では、追加のパラメーターであるコールバック関数を送信し、ページでその関数を定義します。

これは次のようになります。まず、コールバックを定義します。

function myCallback( data ) {
  // do some stuff with data
}

次に、新しいタグを動的に挿入<script>してデータを取得します。

<script src="path.to/remote/server.js?callback=myCallback" type="text/javascript"></script>

これで完了です。

サーバーはフォームの回答を送信します

myCallback( {"your": "answer", "is": "here" } );

コールバック関数を呼び出して処理を開始します。こちらを参照してください。通常の JSON 応答の代わりに、サーバーは、JSON を表すオブジェクトをパラメーターとしてコールバックに関数呼び出しを行います。

パラメータの名前 (私の例では「callback」) は、サービス プロバイダごとに異なる場合があることに注意してください。そのため、使用する前に正しい名前を調べてください。

注意すべきもう 1 つの点は、これはGETリクエストに対してのみ機能することです。この手法をリクエストに使用することはできません。POST

于 2012-06-26T09:24:16.637 に答える