ksoap2 传递复杂对象 复杂数据类型

来源:互联网 发布:免费下载skype软件 编辑:程序博客网 时间:2024/06/05 00:12

    

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. }  
0 0