我们需要传递复杂类型,首先我们要在android中建立一个复杂类型,并且复杂类型包含字段名称和个数一定要与服务上的复杂类型保持一致,对于服务的复杂类型具有哪些字段,我们可以通过查看服务调用的示例得知。如下图所示。

根据上面复杂类型的字段说明,我们在android中建立复杂类型(类型名可以随意),包含两个字段且字段名称必须是Age和Name,数据类型也要一致,上面的这个people代表该复杂类型形参名为people(服务调用的时候必须要保持一样)。需要注意的是,这个复杂类型必须要继承KvmSerializable,这样ksoap2进行服务调用的时候,能够把people对象序列化为服务端能够接受的格式。代码如下:
public class People implements KvmSerializable {
public int Age;
public String Name;
@Override
public Object getProperty(int arg0) {
switch (arg0){
case 0:
return Age;
case 1:
return Name;
default:
return null;
}
}
@Override
public int getPropertyCount() {
return 2;
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
switch (arg0){
case 0:{
arg2.type = PropertyInfo.INTEGER_CLASS;
arg2.name = "Age";
break;
}
case 1:{
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "Name";
break;
}
}
}
@Override
public void setProperty(int arg0, Object arg1) {
switch (arg0){
case 0:{
Age = Integer.parseInt(arg1.toString()) ;
break;
}
case 1:{
Name = arg1.toString();
break;
}
}
}
}
下面是传递复杂对象调用web服务,其中服务地址、操作地址、方法名以及命名空间和前面一样,只需要在服务说明wsdl文档中找operation name节点和operation soapAction节点的值即可,其他地方也类似,只是在封装soapobject的时候有一些区别,代码如下:
//地址声明
private String nameSpace="http://tempuri.org/";
private String url="http://172.21.212.54:8888/WebService.asmx";
private String soapAction="http://tempuri.org/PostPeopleInfo";
private String methodName="PostPeopleInfo";
//服务调用
protected SoapObject getSoapResult() {
SoapObject outObject = new SoapObject(nameSpace, methodName);
People people = new People();
// 设置字段值
people.setProperty(0, 23);
people.setProperty(1, "Juame");
// 设置SoapObject对象
outObject.addProperty("people", people);
//也可以这样设置SoapObject
/*PropertyInfo peoInfo = new PropertyInfo();
peoInfo.setName("people");
peoInfo.setValue(people);
peoInfo.setType(People.class);
outObject.addProperty(peoInfo);*/
SoapSerializationEnvelope serializationEnvelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);//设置soap版本
// 这一步添加映射非常关键
// 第一个参数为命名空间,第二参数为服务器中复杂类型的名称,第三参数是安卓的复杂类型
serializationEnvelope.addMapping(nameSpace, "People", People.class);
serializationEnvelope.bodyOut = outObject;
serializationEnvelope.dotNet = true;// 调用.NET的服务
HttpTransportSE transportSE = new HttpTransportSE(url);
transportSE.debug = true;// 采用调试
try {
transportSE.call(soapAction, serializationEnvelope);// 调用服务
Log.v("happy1", "服务调用成功");
SoapObject result = (SoapObject) serializationEnvelope.bodyIn;
//把结果封送到消息中去,让ui线程显示
Bundle bundle = new Bundle();
bundle.putString("result",result.getProperty(0).toString());
Message message = new Message();
message.setData(bundle);
message.what = 11;
hander.sendMessage(message);
return result;
} catch (IOException ex) {
Log.v("sad", "IO异常");
ex.printStackTrace();
} catch (XmlPullParserException ex) {
Log.v("sad", "xml解析异常");
ex.printStackTrace();
} catch (Exception ex) {
Log.v("sad", "服务调用异常异常");
}
return null;
}
//按钮事件
btnObj.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Thread thread = new Thread(getSoapRequest);
thread.start();
}
});
//线程
Runnable getSoapRequest=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
getSoapResult();
}
};
//消息处理
Handler hander = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what=11){
lblResult.append(msg.getData().getString("result")+"rn");
}
}
};
上面的代码就能够传递复杂类型去调用WebService的服务,返回结果如下:
姓名:Juame/年龄:23
5 简述Wcf与WebServic的区别 (编辑:应用网_丽江站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|