昨天幫同事從其餘服務器傳過來的json數據進行處理,遇到該問題。開始個人思路是用ajax直接請求把數據弄出來就OK了,然而出錯了.緣由是我使用的ajax 返回類型爲json,默認ajax阻止跨服獲取數據的。結合其餘博文,ajax的dataType使用jsonp來解決此問題。開始以爲jsonp與json的使用相似,一步步的寫着代碼,以下: html
$.ajax({ type:'get', async:false, url:'http://112.11.131.238/nanhunongjing/GetCollectInforByCollectId?serverTime=384', dataType:'jsonp', cache:true, contentType:'application/x-www-form-urlencoded;charset=utf-8', jsonp: "callback",//傳遞給請求處理程序或頁面的,用以得到jsonp回調函數名的參數名(默認爲:callback) jsonpCallback:"callBackFun",//自定義的jsonp回調函數名稱,默認爲jQuery自動生成的隨機函數名 success:function(data){ // var json = $.parseJSON(data); alert(data[0].xxx); }, error:function(XMLHttpRequest, textStatus, errorThrown){ alert(XMLHttpRequest.status); alert(XMLHttpRequest.readyState); alert(XMLHttpRequest.responseText); alert(textStatus); alert(errorThrown); console.log(textStatus); } });
看着沒問題,其實問題讓人難一理解。執行上述代碼始終執行error內的方法,用火狐查看調試,也看不出什麼端倪。 java
頁面alert輸出 ajax
status 200
readyState 4
responseText null
errorThrown Error: callBackFun was not called
textStatus parsererror
咱們看到這些信息,通常就上網上查。。。。。 json
jsonpCallback 默認不寫會生成一個名字,如jQuery172031072511965160154_140679384671 跨域
這是回調函數的名字。 服務器
我出錯的重點也在這裏,不明白回調是什麼意思,怎麼個回調法???? app
借鑑http://www.cnblogs.com/know/archive/2011/10/09/2204005.html該博主的寫法。發現jsonp處理返回是以 async
回調函數名("json")總體返回的(例callBackFun(「{'x':'x'}」))。再請求時向後臺傳入了參數callback,也即回調函數名。 函數
後臺處理程序: 測試
String callBackFun = hsRequest.getParameter("callback"); System.out.println("///"+callBackFun); hsResponse.getWriter().print(callBackFun+"([{\"xxx\":1,\"hs\":\"測試\"}])");相似以上代碼處理。
要得到json數據,必定要注意返回數據的格式。
經過上述構思,不可能讓咱們跨域去寫一個回調函數,這種顯然不可以適合應用環境。
我就換了另外一種獲取數據的辦法,利用httpClient去模擬請求獲取遠程服務端的數據,代碼以下:
HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://112.11.131.238/nanhunongjing/GetCollectInforByCollectId?serverTime=384"); try { HttpResponse httpResponse = client.execute(httpGet); //響應狀態 System.out.println("響應狀態:"+httpResponse.getStatusLine()); HttpEntity entity = httpResponse.getEntity(); if (entity != null) { /* 轉化爲文本信息 * 並轉碼 * */ result = EntityUtils.toString(entity,"utf-8"); System.out.println(result); result = new String(result.getBytes("utf-8"),"iso8859-1"); //hsResponse.getWriter().print(result); String callBackFun = hsRequest.getParameter("callback"); System.out.println("///"+callBackFun); hsResponse.getWriter().print(callBackFun+"([{\"xxx\":1,\"hs\":\"測試\"}])"); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally{ //關閉鏈接釋放資源 client.getConnectionManager().shutdown(); }在httpGet()寫入本身的url
獲取的數據通常已是json數據了。若是不是,我猜你也知道怎麼去寫,我這就很少說了。其餘詳細介紹本身在網上搜吧!多看看總會有解決辦法,不要坐等別人給你說給你寫。
有些不足的地方請包涵,謝謝。但願對有問題的朋友有幫助!!!