ksoap2 傳遞複雜對象 複雜數據類型

    

http://blog.csdn.net/jietoulangren/article/details/7551319


關鍵:

SoapObject so = new SoapObject("http://vo.com.cn/xsd","Diary");


    Android客戶端調用服務端的方法時需要提供方法需要的參數,這個參數可能是一個簡單類型,如字符串或者int值,

也可能是服務端定義的一個複雜數據類型。同樣的,服務端返回的可能是一個簡單數據值,或者是一個複雜數據對象,

這裏講一下我的實現方法。部署了一個webservice:DiaryService.下面這張圖是該服務的wsdl頭部描述:


[java] view plaincopy
  1.  //創建請求,參數分別爲Web服務訪問地址、調用的方法,此處調用的是插入日誌方法,需要傳入一個日誌對象  
  2.    SoapObject request = new SoapObject("http://ws.apache.org/axis2""insertDiary");//此處的url即爲wsdl中的targetName  
  3.    HttpTransportSE androidHttpTransport = new HttpTransportSE("http://10.0.2.2:8080/axis2/services/DiaryService?wsdl");  
  4.   
  5.    //創建SoapObject,根據服務端的對象聲明來封裝數據  
  6.    //這裏比較關鍵,客戶端不需要新建對象,可以直接將數據封裝在SoapObjec對象中進行傳遞,至於序列化反序列化的工作,ksoap已經幫我們做了  
  7.    //如果只是傳遞一個簡單數據,而不是對象,則只需將數據通過addProperty封裝到之前新建的SoapObject對象request中即可  
  8.    SoapObject so = new SoapObject("http://vo.com.cn/xsd","Diary");//注意此處的路徑  
  9.    //封裝日誌數據,這裏查看wsdl對於對象的描述,一個屬性對應一個值進行封裝  
  10.    so.addProperty("date",new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date()));  
  11.    so.addProperty("theme",view1.getText().toString());  
  12.    so.addProperty("content",view2.getText().toString());  
  13.       
  14.    
  15.    //設置方法屬性,前者爲WSDL中方法的形參,後者爲實參  
  16.    request.addProperty("vo", so);  
  17.    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);  
  18.    envelope.dotNet = true;  
  19.    envelope.bodyOut = androidHttpTransport;  
  20.    envelope.setOutputSoapObject(request);             
  21.    try {  
  22.     //提交  
  23.         androidHttpTransport.call(null, envelope);  
  24. catch (IOException e) {  
  25.     e.printStackTrace();  
  26. catch (XmlPullParserException e) {  
  27.     e.printStackTrace();  
  28. }  

至於獲得數據,如果傳回的是一個簡單的數據,比如一個String或者Int值,那麼返回的數據中只有一個SoapObject對象,獲得這個對象便可得到返回的值

如果傳回的是一個複雜數據容器,那麼得到的是一個樹狀結構,其中會有多個SoapObject對象,具體操作見下面代碼:

[java] view plaincopy
  1. if (envelope.getResponse() != null) {                     
  2.     SoapObject  result = (SoapObject) envelope.bodyIn;   
  3.   // result.getProperty("name");// name爲屬性的名稱,如果是單條數據,則可以這樣獲得返回的數據  
  4. //如果有多條數據,則可以這樣獲得數據  
  5.     int count = result.getPropertyCount();  //獲得SoapObject對象的個數  
  6.     for(int i=0;i<count;i++){  
  7.         System.out.println("time", ((SoapObject)result.getProperty(i)).getProperty("date"));//獲得時間屬性值  
  8.         System.out.println("title", ((SoapObject)result.getProperty(i)).getProperty("theme"));//獲得主題屬性值  
  9.         System.out.println("info", ((SoapObject)result.getProperty(i)).getProperty("content"));//獲得內容屬性值  
  10.    }  
  11. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章