json和jsonp的使用區別

json和jsonp的使用區別jquery

一.    跨域請求的概念

  JavaScript出於安全方面的考慮,不容許跨域調用其餘頁面的對象。web

 

二.    json和jsonp

  JSON是一種基於文本的數據交換方式(不支持跨域),而JSONP是一種非官方跨域數據交互協議。ajax

  使用json格式傳遞數據的客戶端代碼以下:json

 1 $(function () {
 2     var user = {
 3         "username": "HelloWorld"
 4     };
 5 
 6     $.ajax({
 7         url: "http://localhost:8080/Changyou/UserInfo",
 8         type: "POST",
 9         contentType: "application/json; charset=utf-8",
10         dataType: "json",  //json不支持跨域請求,只能使用jsonp
11         data: {
12             user: JSON.stringify(user)
13         },
14         success: function (data) {
15             $("#user_name")[0].innerHTML = data.user_name;
16             $("#user_teleNum")[0].innerHTML = data.user_teleNum;
17             $("#user_ID")[0].innerHTML = data.user_ID;
18         },
19         error: function () {
20             alert("請求超時錯誤!");
21         }
22     })
23 });

  然而,簡單地使用json並不能支持跨域資源請求,爲了解決這個問題,須要採用jsonp數據交互協議。衆所周知,js文件的調用不受跨域與否的限制,所以若是想經過純web端跨域訪問數據,只能在遠程服務器上設法將json數據封裝進js格式的文件中,供客戶端調用和進一步處理,這就是jsonp協議的原理。該協議的一個要點就是容許用戶傳遞一個callback參數給服務端,而後服務端返回數據時會將這個callback參數做爲函數名來包裹住JSON數據,這樣客戶端就能夠隨意定製本身的函數來自動處理返回數據了。跨域

  簡單的說,就是json不支持跨域,而js能夠跨域,所以在服務器端用客戶端提供的js函數名將json數據封裝起來,再將函數提供給客戶端調用,從而得到json數據。安全

  開發過程當中,若是出現相似 「Origin ****** is not allowed by Access-Control-Allow-Origin.」 的錯誤,則多是因爲json數據不支持跨域致使的,應考慮使用jsonp協議。服務器

  若是出現相似 」SyntaxError: Unexpected token ':'. Parse error.「 的錯誤,則多是因爲返回的json數據沒有用」callback「傳遞的函數名封裝致使的。app

  客戶端代碼以下:函數

 1 $(function () {
 2 
 3     var user = {
 4         "username": "HelloWorld"
 5     };
 6 
 7     $.ajax({
 8         url: "http://localhost:8080/Changyou/UserInfo",
 9         type: "POST",
10         contentType: "application/json; charset=utf-8",
11         dataType: "jsonp",  //json不支持跨域請求,只能使用jsonp
12         data: {
13             user: JSON.stringify(user)
14         },
15         jsonp: "callback",  //傳遞給請求處理程序或頁面的,用以得到jsonp回調函數名的參數名,默認爲callback
16         jsonpCallback: "userHandler",  //自定義的jsonp回調函數名稱,默認爲jQuery自動生成的隨機函數名,也能夠寫"?",jQuery會自動爲你處理數據
17         success: function (data) {
18             $("#user_name")[0].innerHTML = data.user_name;
19             $("#user_teleNum")[0].innerHTML = data.user_teleNum;
20             $("#user_ID")[0].innerHTML = data.user_ID;
21         },
22         error: function () {
23             alert("請求超時錯誤!");
24         }
25     })
26 });

   服務器端代碼以下:jsonp

 1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2     response.setContentType("application/json; charset=utf-8");
 3     String username = new String(request.getParameter("user").getBytes("ISO-8859-1"),"utf-8");
 4     String callback = new String(request.getParameter("callback").getBytes("ISO-8859-1"),"utf-8");
 5     System.out.println("接收到的數據:" + username);
 6     System.out.println("callback的值:" + callback);
 7     JSONObject user = JSONObject.fromObject(username);
 8     System.out.println("接收到的用戶名:" + user.get("username"));
 9     JSONObject userinfo = new JSONObject();
10     userinfo.put("user_name", "張鳴曉");
11     userinfo.put("user_teleNum", "18810011111");
12     userinfo.put("user_ID", "123456789098765432");
13     PrintWriter out = response.getWriter();
14     String backInfo = callback + "(" + userinfo.toString() + ")"; //將json數據封裝在callback函數中提供給客戶端
15     out.print(backInfo);
16     out.close();
17 }

 

儘管客戶端沒有實現userHandler函數,但也能成功運行,緣由就是jquery在處理jsonp類型的ajax時,自動幫你生成回調函數並把數據取出來供success屬性方法來調用。

 

更詳細解釋,參見http://kb.cnblogs.com/page/139725/

相關文章
相關標籤/搜索