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

      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


你可能感兴趣的:(Android开发)