2

私はサーバー担当者にリクエストを送信するクライアント担当者です。私の最終的な目標は、リクエストをjsonpで送信することです。

これは、リクエストを送信したときに取得するサーバーの応答です?accept=json(jsonpではないため、無効なセッションエラーが発生します)

{"errorCode":-15,"errorDescription":"SessionNotFoundException - Session not found","success":false,"payload":null}

読めますし、大丈夫です。

ただし、これは に対するサーバーの応答です?accept=jsonp

jQuery171024326910870149732_1351429007451({"action":"", "type":"", "callerId":""}, {"errorCode":0,"errorDescription":"OK","success":true,"payload":null});

それは、読み方がわからない次の 2 つのオブジェクトの形式になっています{a},{b}

jQuery ajax 呼び出しを使用すると、サーバーのデータの出力は{a}次の部分にすぎません。

Object {action: "", type: "", callerId: ""}

私の2つの質問は次のとおりです。

  1. 2 つのオブジェクト ( ) を持つサーバーの応答{a},{b}は有効ですか? サーバー担当者は、そのようなオブジェクトを送信することで間違いを犯しますか、それとも有効ですか?
  2. jsonp オブジェクトを読み取るにはどうすればよいですか? 正しく読んでいないように見える私のajax呼び出しの何が問題になっていますか?

これは私が使用する ajax 呼び出しです。

$.ajax({
            url:url,
            dataType:'jsonp',
            success:function(data){
                console.log("data is,"data")
                //if the call was success
                if (data.success) {

                    //if errors
                }   else {

                }
            }
        } 
4

1 に答える 1

5

成功のコールバックが 2 つの引数を処理できないことを実際に確認するために、2 つの引数関数と 2 つのオブジェクトを渡して簡単なテストを試みました。

function test(a,b) {
    console.info(a);
}

test({"name":"test"},{"hello":"world"});

JavaScript Object Notation で 2 つの別個のオブジェクトを 2 つの引数を期待する関数に渡したので、これは成功しました。

次に、単純な PHP スクリプトを使用してサンプル レスポンスを再作成しました。

<?php echo $_REQUEST["callback"]?>({"test":"test"},{"hello":"world"});

次のステップでは、2 つの引数を取るように成功のコールバックを変更しました。

$.ajax({
            url:'http://local.sandbox.com/jsonp2/test.php',
            dataType:'jsonp',
            success:function(data, data2){
                console.log("data is " + data2)
                //if the call was success
                if(data.success) {
                   alert("yes");
                    //if errors
                }   else {
                    alert(data2.hello);
                }
            }
        }); 

jQuery AJAX Success Handler docsに従って、ここで問題が発生しました。

成功(データ、テキストステータス、jqXHR)

関数、配列 リクエストが成功した場合に呼び出される関数。関数には 3 つの引数が渡されます。

  • サーバーから返されたデータで、dataType パラメータに従って書式設定されています。
  • ステータスを説明する文字列。
  • jqXHR (jQuery 1.4.x では XMLHttpRequest) オブジェクト。

jQuery 1.5 の時点で、success 設定は関数の配列を受け入れることができます。各関数が順番に呼び出されます。これは Ajax イベントです。

  • 強調は私のものです

成功ハンドラーの 2 番目のパラメーターは常に応答のステータスになるため、出力はコンソールで「データは成功です」であり、else ブロックのアラートは未定義です。

jQuery の jsonp 実装は、コールバック内の単一のオブジェクトを処理するように設計されていることが最も確実です。これは、サーバーが応答の「パディング」またはラッパーとして使用するコールバック クエリ パラメータのカスタム値を、通常は「jQuery1232432423432432」の形式で置き換えるためです。 . ドキュメントによると、成功ハンドラーは 3 つの引数を取ります。最初の引数はオブジェクトで、最後の 2 つは jQuery によって提供されます。パディングされた関数は 1 つの引数しか取りません。したがって、jQuery はこの問題を解決できません。

ただし、サーバーが生成するものを制御できないと仮定して、既存のサーバー側の応答を引き続き利用する手法があります。


解決策: jQuery を使用せずにスクリプト タグのリモート処理を使用する:

// this is a custom function to make jsonp requests to the server.
function jsonp(url, callback) {
    var script = document.createElement("script");
    script.setAttribute("type","text/javascript");
    script.setAttribute("src", url + "?callback="+callback + "&cachebuster="+new Date().getTime());
    document.getElementsByTagName("head")[0].appendChild(script);
}

関数を呼び出すには、名前付きコールバック ハンドラを渡すことを除いて、$.ajax 呼び出しの代わりに使用します。

jsonp(url, "myCustomSuccessFunction");

カスタムの名前付き成功コールバック関数を必ず定義してください。

function myCustomSuccessFunction(data1, data2) {
    console.info(data1);  // contains first object
    console.info(data2);  // contains second object

    // do stuff w/said objects here

}
于 2012-10-28T13:58:05.073 に答える