為什么返回的數據前面有callback?


這是一個同學出現的問題,問到了我。

應該是這樣的:

但問題是這樣的:

我看了所請求的格式和后台要求的也是相同的。而且我也是這種做法,為什么他的就不行呢?

打了幾遍 JSON.parse 也都是不行……然后也不知道什么情況的耿耿於懷的回去了。

 

后來在網上搜索,結果都不是想要的。

把 callback 字符串截取掉,這個就不用說咯。這是一種把 json 弄出來的方法。但並不是要問的問題。要問的是:

為什么返回的數據前面會加上 callback ,括號里才是 json 內容。

 

知乎相似問題:

調用一個api,返回數據格式是:jsonCallback(括號里面才是json),該怎么處理?

  

百度知道相似問題:

如何在這組返回的數據中獲取data對應字符串中jsonCallBack函數並通過其調用?

  

var jsonback = function (json) {
    return json;
};
var jsonObj = eval(obj.data);

//或

var jsonStr = JSON.parse(obj.data.match(/^jsonback\((.*)\);$/)[1]);

 

csdn相似問題:

關於jsonp返回回來的數據怎么解析
jQuery18307755723037111298_1402151229915([{ "list": [{ "id": 1, "title": "title 1" }, { "id": 2, "title": "title 2" }, { "id": 3, "title": "title 3"}] }])

//jq的代碼是這樣子的
function loadInfo() {
    var url = "http://192.168.100.101:81/A.aspx";
    $.ajax({
        type: "get",
        async: true,
        url: url,
        dataType: "jsonp",
        jsonp: "callback",
        //服務端用於接收callback調用的function名的參數
        success: function(data) {
            alert(data.list);
            //這個地方報錯是,不是一個函數
        },
        error: function() {
            alert("error");
        }
    });
}
View Code

 


 

就沒幾個人回答 “為什么”,最多都在說 “怎么做”?

好吧。通過自己的研究。發現問題是這樣的:

如果把 dataType:"jsonp" 的 dataType 寫錯,就會出現這種情況。其實也相當於沒有傳 dataType 這個參數。

但是如果把 "jsonp" 寫錯,就觸發請求失敗的函數了 error:function(){} 。

 

那么問題又來了,像上面 csdn 中的 dataType 好像沒寫錯喲,那返回那樣的數據格式 jQuery...([]) 是什么鬼?我想,可能 () 括號前面的 jQuery... 就像 上面其他情況中的 callback、jsonback 一樣,相當於一種名字吧。 jsonp 和 json 是與之對應的。但 jQuery... 就不知道要如何與之對應了。所以就解析不了。

擴展閱讀:

$.getJSON()方法跨域 去取得服務器的json對象的時候,url的后綴最后帶一個"callback=?"的參數作為成功的回調函數;如:

 

var url = "${BIPJS}/intf/accountsOfRefuseEmail.jsp?act=add&siteId=${LANG.siteId}&accountId=${loginId}&callback=?";
$.getJSON(url, {} , function(data) {  
            var code = data.code;  
            if(code == 0){  
                $('#floatOne').myFadeIn();  
            }  
        });

 

 

 此時返回的data是一個json對象;相應地,服務器返回字符串應該要這種樣式:

 

 

String callback = T.stringValue(getRequestParams(request,"callback"),"");

JSONObject jo = new JSONObject();

// put key/value in jo

out.print(callback + "(" + jo + ")");

 

 

原理:Jquery在解析請求callback=?的時候,會自動生成一個callback=jsonp***的字符串,這個字符串jsonp***在成功回調的時候作為一個方法,被Jquey自動執行,參數是一個json格式的字符串(這里是data)。相應地;服務器返回的字符串要這種形式:jsonp***(JSONObject)。

如:剛上面的url被Jquey解析成:

  1. Request URL:
    http://localhost.pcauto.com.cn:12385/intf/accountsOfRefuseEmail.jsp?act=add&siteId=2&accountId=388&callback=jsonp1381976698163&_=1381976708919

 

服務器返回的字符串形式:

jsonp1381976698163({"code":0,"msg":"增加用戶成功"})

 

Jquery的回調方法jsonp1381976698163(jsonStr)就是要把字符串jsonStr轉換成josn對象,這里就是轉換成data這個json對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM