JSONP最主要的是可以解決跨域問題,不然誰會沒事用這種格式。
下面是我用JSONP的一些心得體會:
JSONP是JSON with Padding的略稱。它是一個非官方的協議,它允許在服務器端集成Script tags返回至客戶端,通過javascript callback的形式實現跨域訪問。對,它就是一種協議,不是數據格式,開始我也被
dataType: "jsonp"這個鬼東西誤導了,我們根本不需要考慮格式問題,該返回什么格式就返回什么格式,只要注意幾個地方就可以了:
1. jsonp: "callback",jsonpCallback:"userHandler",這兩個可以自定義也可以不定義,為了可讀性建議還是自定義好。
$.ajax({ url: "http://172.25.19.63:8084/web/", type: "post", dataType: "jsonp", jsonp: "callback", jsonpCallback:"userHandler", // contentType: 'application/json', // data:JSON.stringify(json), data:{password: "password", username: "username"}, success: function(data){ alert(data.name)//得到”忍着不哭泣“
},
error: function(data){
alert(data.status);//調用狀態
}
});
2. 在服務器端callback = resquest.getParamter("callback")取到的值是"userHandler",然后如下圖拼裝起來寫入response里面就OK了
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { callback = resquest.getParamter("callback")//取到的值應該是userHandler PrintWriter out = response.getWriter(); String json = {"name":"忍着不哭泣"} out.println(callback+"("+json+")"); out.close(); }
3.上圖是json格式字符串(可以其他格式)客戶端就會取到json對象。
Jsonp原理:
首先在客戶端注冊一個callback, 然后把callback的名字傳給服務器。
此時,服務器先生成 json 數據。
然后以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的參數 jsonp.
最后將 json 數據直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。
客戶端瀏覽器,解析script標簽,並執行返回的 javascript 文檔,此時數據作為參數,傳入到了客戶端預先定義好的 callback 函數里.(動態執行回調函數)