http://blog.csdn.net/jietoulangren/article/details/7551319
關鍵:
SoapObject so = new SoapObject("http://vo.com.cn/xsd","Diary");
Android客戶端調用服務端的方法時需要提供方法需要的參數,這個參數可能是一個簡單類型,如字符串或者int值,
也可能是服務端定義的一個複雜數據類型。同樣的,服務端返回的可能是一個簡單數據值,或者是一個複雜數據對象,
這裏講一下我的實現方法。部署了一個webservice:DiaryService.下面這張圖是該服務的wsdl頭部描述:
- //創建請求,參數分別爲Web服務訪問地址、調用的方法,此處調用的是插入日誌方法,需要傳入一個日誌對象
- SoapObject request = new SoapObject("http://ws.apache.org/axis2", "insertDiary");//此處的url即爲wsdl中的targetName
- HttpTransportSE androidHttpTransport = new HttpTransportSE("http://10.0.2.2:8080/axis2/services/DiaryService?wsdl");
- //創建SoapObject,根據服務端的對象聲明來封裝數據
- //這裏比較關鍵,客戶端不需要新建對象,可以直接將數據封裝在SoapObjec對象中進行傳遞,至於序列化反序列化的工作,ksoap已經幫我們做了
- //如果只是傳遞一個簡單數據,而不是對象,則只需將數據通過addProperty封裝到之前新建的SoapObject對象request中即可
- SoapObject so = new SoapObject("http://vo.com.cn/xsd","Diary");//注意此處的路徑
- //封裝日誌數據,這裏查看wsdl對於對象的描述,一個屬性對應一個值進行封裝
- so.addProperty("date",new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date()));
- so.addProperty("theme",view1.getText().toString());
- so.addProperty("content",view2.getText().toString());
- //設置方法屬性,前者爲WSDL中方法的形參,後者爲實參
- request.addProperty("vo", so);
- SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
- envelope.dotNet = true;
- envelope.bodyOut = androidHttpTransport;
- envelope.setOutputSoapObject(request);
- try {
- //提交
- androidHttpTransport.call(null, envelope);
- } catch (IOException e) {
- e.printStackTrace();
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- }
至於獲得數據,如果傳回的是一個簡單的數據,比如一個String或者Int值,那麼返回的數據中只有一個SoapObject對象,獲得這個對象便可得到返回的值
如果傳回的是一個複雜數據容器,那麼得到的是一個樹狀結構,其中會有多個SoapObject對象,具體操作見下面代碼:
- if (envelope.getResponse() != null) {
- SoapObject result = (SoapObject) envelope.bodyIn;
- // result.getProperty("name");// name爲屬性的名稱,如果是單條數據,則可以這樣獲得返回的數據
- //如果有多條數據,則可以這樣獲得數據
- int count = result.getPropertyCount(); //獲得SoapObject對象的個數
- for(int i=0;i<count;i++){
- System.out.println("time", ((SoapObject)result.getProperty(i)).getProperty("date"));//獲得時間屬性值
- System.out.println("title", ((SoapObject)result.getProperty(i)).getProperty("theme"));//獲得主題屬性值
- System.out.println("info", ((SoapObject)result.getProperty(i)).getProperty("content"));//獲得內容屬性值
- }
- }