3

jsonpjQuery.ajax のドキュメント、具体的にはとの 2 つのオプションを理解できませんjsonpCallback

私が理解しているjsonpのは、サーバーが期待する GET パラメータの名前 (通常は「コールバック」) でありjsonpCallback、応答をラップする関数の名前であるということです。シンプルに見えます。

しかし、jQuery.ajax docの説明は、これを少し複雑にしています。jsonpここでオプションの完全なテキストを引用し、わかりにくいものを太字でマークしたいと思います。

jsonp

jsonp リクエストでコールバック関数名をオーバーライドします。この値は、 「callback=?」で「callback」の代わりに使用されます。URL のクエリ文字列の一部。したがって、 {jsonp:'onJSONPLoad'} は 'onJSONPLoad=?'になります。サーバーに渡されます。jQuery 1.5 の時点で、jsonp オプションを false に設定すると、jQuery が「?callback」文字列を URL に追加したり、「=?」を使用しようとしたりするのを防ぐことができます。変身のために。この場合、jsonpCallback設定も明示的に設定する必要があります。たとえば、{ jsonp: false, jsonpCallback: "callbackName" }

質問は次のとおりです。

1.「=」ってどういう意味または「callback=?」(追加の疑問符)?ここのように JSONP AJAX リクエストを実行すると:

 $.ajax('http://fake.com',{
     dataType: 'jsonp',
     success: function(data) {console.log(data);}
 }); 

URL は次のようになります。クエスチョン マークはありません。

http://fake.com/?callback=jQuery18104830878316494931_1352981996209&_=1352981999411

2.追加パラメータ(アンダースコア)とは_=1352981999411?

3.言葉のIn this case, you should also explicitly set the jsonpCallback setting意味は?相互関係が見えません。を設定{ jsonp: false, jsonpCallback: "callbackName" }すると、ドキュメントに記載されているように、クエリは次のようになります。

http://fake.com/?_=1352981999411

「callbackName」はまったく使用されていないのに、なぜそれを指定するのですか?

私の感謝。

4

3 に答える 3

3

JSONPの背後にある考え方は次のとおりです。

クロスドメインポリシーのため、外部ソースのデータを要求することは許可されていません。たとえば、私のサーバーに、電話番号を入力すると人の名前を返す機能があるとします。

私のドメインにないあなたのウェブサイトは、私のサーバーへのajax呼び出しを実行してデータを受信することを許可されていませんFlater

このルールには1つの例外があります。それは、外部から読み込まれるスクリプトを使用する場合です。別のサーバーなどでホストされているjQuery.jsファイルをロードできます。外部サーバーからデータをリクエストすることはできませんが、 javascriptをリクエストすることはできます。

したがって、この結果を受け取ることは不可能です。

Flater

しかし、これをあなたのページに置くことは可能です:

<script src="http://externalserver.com/script.js">

通常のJavaScriptを受け取ります。

<script>
    function doSomething(value) {
        alert(value);
    }

    doSomething("First");
    doSomething("Second");
</script>

これは、次のjavascriptも受け取ることができることを意味します(そしてここが重要な部分です) 。

<script>
    doSomething("Flater");
</script>

ページに関数をすでに定義しているとdoSomething()します。このスニペットが発生したサーバー(http://externalserver.com/script.js)には関数で何が起こっているのか見当がつかないにもかかわらず、既存の関数eventを呼び出すため、これは完全に有効なjavascriptになりますdoSomething

したがって、技術的には、最初に必要なデータを取得することができ(例として文字列を使用しましたが、JSONも同様に有効でした)、その周りのJavaScriptは単にウィンドウドレッシング(「パディング」)として使用されます。

現在、ほとんどのJSONP対応サイトで実行できるのは、関数の名前を選択することです。例えば:

<script src="http://externalserver.com/script.js?callback=doSomething">
<script src="http://externalserver.com/script.js?callback=banana">
<script src="http://externalserver.com/script.js?callback=Process_Name">

戻るだろう

<script>
    doSomething("Flater");
</script>
<script>
    banana("Flater");
</script>
<script>
    Process_Name("Flater");
</script>

Wichは、コールバックパラメーターとして使用している関数名を定義した場合、JSONを渡す必要のある関数を外部サーバーに効果的に伝えることができることを意味します。

これは、すべてが機能する必要のある複数の機能がある場合に非常に便利です。

JSONPの使用目的を明確にできたと思いますか?質問がある場合は、質問してください:-)

アップデート

ちなみに、例ではスクリプトタグを使用しました。すでに述べたように、jQueryは、基本的にajax呼び出しのように見えるところまで進んでいます(そうあるべきです)。ただし、基本的な原則を説明する方が簡単だと思いました。

于 2012-11-15T12:58:31.830 に答える
3

コールバック名はオプションです。指定しない場合は、デフォルトの名前が使用されます。したがって、省略した場合onJsonLoadcallback.

JSONPは<script>タグを介して機能するため、JSONは関数でラップされ、通常のJSONは次のようになります。

{prop: value}

なります:

callback({prop: value});

script タグが読み込まれると、jQuery はこの関数を呼び出して JSON データを取得できます。

は、リクエストのキャッシュを停止する_=123456788だけです。Date.getTime()

于 2012-11-15T12:48:34.673 に答える
1

callback=?

Jquery は、?

一部の API では、API で概説されているように、特定のコールバックを提供する必要があります。

ほとんどの場合、サーバーは単純$_GET['callback']に例として php を使用します。あなたの場合、それは送り返されます

jQuery18104830878316494931_1352981996209( /* json string*/)

jQuery18104830878316494931_1352981996209コールバックです。

理解を深めるために、ブラウザ コンソールの [ネット] または [ネットワーク] タブで jsonp リクエストを調べます。jQuery が送信するパラメーターを確認し、完全な応答を確認できます。

于 2012-11-15T13:04:04.080 に答える