1

アホイ!

別のドメイン上の Web サーバーからの ajax 呼び出しを処理するために WCF サービスを使用しています (したがって、JSONP を採用しています)。私の呼び出しは次のようになります。

$.ajax({
    dataType: 'jsonp',
    type: 'GET',
    url: 'http://localhost/s.svc/login?callback=?&l=en&e=foo&p=bar',
    success: function (serverData) {
        // [...]
    },
    error: function (jqXHR, textStatus, errorThrown) {
        // [...]
    }
});

サーバーからの応答は次のようになります。

?({"DataIsValid":true,"ErrorOccurred":false,"EmailAddressValidationMessage":"","PasswordValidationMessage":""});

その後、jQuery はそれを読み取るときにparsererrorをスローします。

上記の応答は有効な JSON のように見えます。ドキュメントによると、「?callback=?」と思われます。JSONP を使用した $.ajax 呼び出しに適しています。

私が明らかに欠けているものを指摘してくれてありがとう:-)

4

2 に答える 2

3

私がここに見るいくつかのこと:

  1. URL 内のコールバック パラメータを削除します。jQuery JSONP 呼び出しを行うと、独自のコールバックが追加され、成功/エラー関数が呼び出されます。バックエンドで、リクエストから「callback」パラメーターを読み取り、それを使用して jsonp 応答をラップします (表示されることは既に行っているため、その部分を変更しないでください)。
  2. 成功関数に入るserverDataと、 は文字列になります。jQuery.parseJSON()またはで解析しJSON.parse()ます。

var data = jQuery.parseJSON(serverData); // または JSON.parse(serverData); を使用します。

それはそれを行う必要があります。

最後に 1 つ。解析で「予期しないトークン...」エラーが発生し始めた場合は、JSON 文字列のどこかに制御文字が隠されている可能性があります。この問題があり、それは改行 ("\n") でした。Chrome の開発ツール コンソールなどで解析する文字列を取得して、それがどの文字であるかを特定し、それを置き換えます。

var data = jQuery.parseJSON(serverData.replace(/\n/g,""));
于 2013-07-16T13:36:03.343 に答える
0

MVCアクションメソッドの応答(コールバックメソッドで応答をラップ)で以下がありませんでした。

response.Write(request.Params["callback"] +"(" +htmlContent +");");

また、jquery ajax 呼び出しは次のようになります。

jQuery.ajax({
           url:"https://servername/virtualDirectory/ActionMethod,               
           crossDomain: true,
            dataType: 'jsonp',                  
            type: 'GET',
            cache: false,
            jsonp:"callback",              
            success: function (data) {   
                alert('success');                
                $fs("#fs_container").htm(data);                   
            },
            error: function (data, status, req) {                          
               alert(req.responseText + " " + status);
            }                 
});
于 2015-02-11T08:40:13.047 に答える