Android通过ksoap向webserice传递复杂类型数据

来源:互联网 发布:上海大学乐乎社区 编辑:程序博客网 时间:2024/06/05 15:32

      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"));//获得内容属性值   }}


原创粉丝点击