昨天幫同事從其他服務器傳過來的json數據進行處理,遇到該問題。開始我的思路是用ajax直接請求把數據弄出來就OK了,然而出錯了.原因是我使用的ajax 返回類型爲json,默認ajax阻止跨服獲取數據的。結合其他博文,ajax的dataType使用jsonp來解決此問題。開始覺得jsonp與json的使用類似,一步步的寫着代碼,如下:
$.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內的方法,用火狐查看調試,也看不出什麼端倪。
頁面alert輸出
status 200
readyState 4
responseText null
errorThrown Error: callBackFun was not called
textStatus parsererror
我們看到這些信息,一般就上網上查。。。。。
jsonpCallback 默認不寫會生成一個名字,如jQuery172031072511965160154_140679384671
這是回調函數的名字。
我出錯的重點也在這裏,不明白回調是什麼意思,怎麼個回調法????
借鑑http://www.cnblogs.com/know/archive/2011/10/09/2204005.html該博主的寫法。發現jsonp處理返回是以
回調函數名("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數據了。如果不是,我猜你也知道怎麼去寫,我這就不多說了。其他詳細介紹自己在網上搜吧!多看看總會有解決辦法,不要坐等別人給你說給你寫。
有些不足的地方請包涵,謝謝。希望對有問題的朋友有幫助!!!