加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 23:51:59 所属栏目:安全 来源:网络整理
导读:?? ?? http://www.voidcn.com/article/p-fjvmaxwd-bks.html 关键: SoapObject?so?=? new ?SoapObject( "http://vo.com.cn/xsd" , "Diary" ); ? ? Android 客户端调用服务端的方法时需要提供方法需要的参数,这个参数可能是一个简单类型,如字符串或者 int

????

http://www.voidcn.com/article/p-fjvmaxwd-bks.html


关键:

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


? ? Android客户端调用服务端的方法时需要提供方法需要的参数,这个参数可能是一个简单类型,如字符串或者int值,

也可能是服务端定义的一个复杂数据类型。同样的,服务端返回的可能是一个简单数据值,或者是一个复杂数据对象,

这里讲一下我的实现方法。部署了一个webservice:DiaryService.下面这张图是该服务的wsdl头部描述:


[java]? view plain copy
  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. }??

至于获得数据,如果传回的是一个简单的数据,比如一个String或者Int值,那么返回的数据中只有一个SoapObject对象,获得这个对象便可得到返回的值

如果传回的是一个复杂数据容器,那么得到的是一个树状结构,其中会有多个SoapObject对象,具体操作见下面代码:

copy
    if?(envelope.getResponse()?!=?null)?{?????????????????????
  1. ????SoapObject??result?=?(SoapObject)?envelope.bodyIn;???
  2. ??//?result.getProperty("name");//?name为属性的名称,如果是单条数据,则可以这样获得返回的数据??
  3. //如果有多条数据,则可以这样获得数据??
  4. ????int?count?=?result.getPropertyCount();??//获得SoapObject对象的个数??
  5. ????for(int?i=0;i<count;i++){??
  6. ????????System.out.println("time",?((SoapObject)result.getProperty(i)).getProperty("date"));//获得时间属性值??
  7. ????????System.out.println("title",?((SoapObject)result.getProperty(i)).getProperty("theme"));//获得主题属性值??
  8. ????????System.out.println("info",?((SoapObject)result.getProperty(i)).getProperty("content"));//获得内容属性值??
  9. ???}??
  10. }??

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读