甚麼是JSONP
The script tag method for cross-domain data fetching: JSON with Padding, or simply JSONP. - Bob IppolitoJSONP也就是JSON with Padding,意思就是讓JSON資料添加了一些添加物(也就是function name),主要用來解決跨域資源存取的問題,用JSONP抓到的資料並不是JSON,而是一段javascript function並包含了JSON資料的程式碼,瀏覽器在取得後不是使用JSON解析器而使用JavaScript執譯器執行並得到結果。
其實就是這篇文章的上一篇文章跨域請求 (cross domain ajax)所提到的,如果你要了解JSONP的基礎知識建議你可以先閱讀上一篇文章,本文章將繼續探討與並使用jQuery實作出更直觀且容易使用的應用。
jQuery.getJSON
jQuery.getJSON方法主要是透果GET發送請求(request)到伺服器,並將伺服器JSON格式的結果轉換成javascript的物件,在jQuery1.2版中,getJSON方法提供一個新的功能,這個功能就是讓我們能夠對其他Domain發出請求,並不需要自己撰寫動態的script標籤。實作
前端程式碼
// getJSON example
$.getJSON("http://localhost:8080/MemberAction.do?op=999&callback=?", function(data){console.log(data);});
後端程式碼
private ActionForward crossLogin(ActionMapping mapping,
MemberActionForm form, HttpServletRequest request,
HttpServletResponse response, HttpSession session) {
String callback = form.getCallback();
String membername = form.getMembername();
System.out.println("===========================");
System.out.println("the callback name is " + callback);
System.out.println("===========================");
String result = callback + "({membername:'hi " + membername + ", welcome',logintime:"
+ System.currentTimeMillis() + "})";
try {
response.getOutputStream().write(BytesUtil.toBytes(result));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
結果
伺服器輸出Log
前端console.log
我們觀察上面範例,它與同域的getJSON用法並沒有太大的差別,主要的差別在於參數callback=?,這是甚麼意思呢,回顧上一篇文章,我們在伺服器回傳了將要執行的function名稱讓前端執行,在getJSON方法中callback扮演的就是這個角色,callback=?這個參數在送出請求前jQuery會自動的產生一個沒有衝突的函數名稱取代掉?,因此後端可以取得這個parameter作為回傳的函式名稱,當後端送出回應後,getJSON第二的參數(匿名function:也就是callback)會自動的執行。
沒有留言:
張貼留言