json與jsonp的區別與聯系


 要談清楚這個問題,我們需要從http協議訪問說起. 網頁程序訪問是一種B/S架構,也就是每次用戶需要獲取新的內容,

就需要通過瀏覽器(B,browser)向服務器發出一條請求,然后服務器(S,server)向瀏覽器返回數據,

這個過程成為request - response(請求 -響應)。 上述的請求過程,其實就是一個數據傳輸的過程,

將前台的數據傳輸到后台,再從后台將數據傳輸到前台。而在前后台,數據以各自的語言語法的數據結構形式進行組織,

比如js的字符串,數組,對象,后端php程序的字符串,數組,對象。 要將前端中js的數據傳輸到后台php,

是不能直接以原有結構傳輸,只能以ascii碼傳輸(也就是a,b,c,d.....),所以所有的非ascii碼數據都必須轉為ascii碼,

比如要傳遞一個數組給php,必須將數組按照特定的規范轉為字符串,傳到php后,再經過反逆處理,還原為數組。

這種數據轉換過程稱為編碼與解碼。在以前,前后台交互通常借助於xml來傳輸,但這種格式傳輸效率低,占用網絡流量資源,

所以后來就出現了json格式。 json格式與xml不同,不需要做很多的tag封裝,只需要像寫js對象一樣書寫,

所以傳輸效率極高:{"name":"平哥","job":"teacher"},

這就是json字符串,json字符串與js對象相比只是在鍵名上多了一對引號,

這種格式就稱為json格式。json格式被各種后台語言支持,所以具有良好的通用性,而在前端,js可以直接將json字符串作為對象進行操作,

非常方便。json的上述優點,使得現在前后台交互中普遍選擇json作為數據交換格式。所以要牢記:json是一種數據格式,

使用這種格式組成的字符串成為json字符串或者json串 那么什么又是jsonp呢,它與json之間又有什么聯系呢?

我們還是從請求-響應模式說起,用戶每次請求新的內容,需要向后台發一條請求,在互聯網剛開始的時候,

即使你只想獲取網頁某一處的內容更新,也要向后台請求一個新的完整網頁,即使這個網頁只有一小處變化,

這就浪費了很大的資源,因為你只需要更新一小塊內容,卻要反復請求相似的內容。所以,人們就想了一些解決辦法,

使用iframe,動態js請求,xhr(ajax)。這些解決辦法各有優逆。 jsonp是動態js請求方案,

具體的實現如下:

通過在頁面創建一個javascript的標簽 script = document.createElement("script") 設置script的srcscript.src = "后台地址" 這樣如果打開網頁調試工具,

在網絡請求中就可以看到產生了一條請求 當然這樣還不是jsonpjsonp是在這個基礎上改進的。

首先在頁面上定義一個js函數:

function show(jsonString){

.....使用jsonString做點事,jsonString是json串

}

向后台傳輸的的參數中增加一個參數,

假設參數名是callbacksrcipt.src = "后台接口地址?callback=show"這意思就是告訴后台,我這個有一個函數是show,

后台執行完后,需要通知前台執行一下這個函數 后台接收到callback后,

就會將執行結果的數據轉換稱json串,

使用傳入的回調函數名封裝起來以php為例user = array('name'=>'luxp','job'=>'teacher');user_jsonstr = json_encode(user); //user_jonstr變成{'name':'luxp','job':'teacher'}

最后,將數據與回調函數包好一起輸出到前台echo "show({'name':'luxp','job':'teacher'});" 當輸出的show({'name':'luxp','job':'teacher'});傳輸到前台時,就會執行 以上步驟就是jsonp的實現過程,所以jsonp是一種數據傳輸方式:

前台向后台在其他參數之外,額外傳一個回調函數,后台就用這個回調函數將一個json串包含在其中,傳回前台。

jsonp的回調函數的參數json串,這是jsonp與json之間的聯系


免責聲明!

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



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