要談清楚這個問題,我們需要從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之間的聯系