ajax 跨域獲取資料jsonp使用
昨天幫同事從其他伺服器傳過來的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資料了。如果不是,我猜你也知道怎麼去寫,我這就不多說了。其他詳細介紹自己在網上搜吧!多看看總會有解決辦法,不要坐等別人給你說給你寫。
有些不足的地方請包涵,謝謝。希望對有問題的朋友有幫助!!!