ajax 跨域獲取數據jsonp使用

昨天幫同事從其餘服務器傳過來的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數據了。若是不是,我猜你也知道怎麼去寫,我這就很少說了。其餘詳細介紹本身在網上搜吧!多看看總會有解決辦法,不要坐等別人給你說給你寫。

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

相關文章
相關標籤/搜索