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數據了。如果不是,我猜你也知道怎麼去寫,我這就不多說了。其他詳細介紹自己在網上搜吧!多看看總會有解決辦法,不要坐等別人給你說給你寫。

有些不足的地方請包涵,謝謝。希望對有問題的朋友有幫助!!!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章