Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍
Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍
最近在学校搞点东西,搞了2天的webservice,心累呀,今天中午和小伙伴终于弄通了,感觉就是一些细节问题没有注意到,啊,我的时间呀,进这么过去了,为了不让小伙伴们走弯路,我还是认真的把开发文档写一遍吧!
首先,如果我们要用CXF发布webservice用自定义类型的对象来当参数传递的话,我们应该先把这个类序列化一遍,下面就是我测试的代码,我创建了一个TGrade类,实现了KvmSerializable接口,这个接口里面的三个方法,这个接口的好处在于不需要服务端在去反序列化实体对象了,
publicclassTGradeimplementsKvmSerializable{
//Fields
privateIntegerGId;
privateIntegerGMax;
privateIntegerGMin;
privateStringGName;
privateStringGPic;
privateStringGType;
//Constructors
/**defaultconstructor*/
publicTGrade(){
}
/**minimalconstructor*/
publicTGrade(IntegerGMax){
this.GMax=GMax;
}
/**fullconstructor*/
publicTGrade(IntegerGMax,IntegerGMin,StringGName,StringGPic,
StringGType){
this.GMax=GMax;
this.GMin=GMin;
this.GName=GName;
this.GPic=GPic;
this.GType=GType;
}
//Propertyaccessors
publicIntegergetGId(){
returnthis.GId;
}
publicvoidsetGId(IntegerGId){
this.GId=GId;
}
publicIntegergetGMax(){
returnthis.GMax;
}
publicvoidsetGMax(IntegerGMax){
this.GMax=GMax;
}
publicIntegergetGMin(){
returnthis.GMin;
}
publicvoidsetGMin(IntegerGMin){
this.GMin=GMin;
}
publicStringgetGName(){
returnthis.GName;
}
publicvoidsetGName(StringGName){
this.GName=GName;
}
publicStringgetGPic(){
returnthis.GPic;
}
publicvoidsetGPic(StringGPic){
this.GPic=GPic;
}
publicStringgetGType(){
returnthis.GType;
}
publicvoidsetGType(StringGType){
this.GType=GType;
}
@Override
publicObjectgetProperty(intarg0){
switch(arg0){
case0:
returnGId;
case1:
returnGMax;
case2:
returnGMin;
case3:
returnGName;
case4:
returnGPic;
case5:
returnGType;
default:
break;
}
returnnull;
}
@Override
publicintgetPropertyCount(){
//TODOAuto-generatedmethodstub
return6;//y要注意这里,必须等于参数的个数,不然服务端没有办法接受有些参数
}
@Override
publicvoidgetPropertyInfo(intarg0,Hashtablearg1,PropertyInfoarg2){
switch(arg0){
case0:
arg2.type=PropertyInfo.STRING_CLASS;
arg2.name="GId";
break;
case1:
arg2.type=PropertyInfo.STRING_CLASS;
arg2.name="GMax";
break;
case2:
arg2.type=PropertyInfo.STRING_CLASS;
arg2.name="GMin";
break;
case3:
arg2.type=PropertyInfo.STRING_CLASS;
arg2.name="GName";
break;
case4:
arg2.type=PropertyInfo.STRING_CLASS;
arg2.name="GPic";
break;
case5:
arg2.type=PropertyInfo.STRING_CLASS;
arg2.name="GType";
break;
default:
break;
}
}
@Override
publicvoidsetProperty(intarg0,Objectarg1){
switch(arg0){
case0:
GId=Integer.parseInt(arg1.toString());
break;
case1:
GMax=Integer.parseInt(arg1.toString());
break;
case2:
GMin=Integer.parseInt(arg1.toString());
break;
case3:
GName=arg1.toString();
break;
case4:
GPic=arg1.toString();
break;
case5:
GType=arg1.toString();
break;
default:
break;
}
}
}
//-----------------------------下面是我测试部分的代码,这部分代码很重要,需要认真的看,我也写的比较详细,代码的世界模糊不得
publicbooleanaddMaintenanceInfo(){
StringmethodName="addGrade";//服务端的方法
StringsoapAction=“http://10.127.80.67/gbckf/Android/GradeService”+methodName;
TGradeperson=newTGrade();
person.setProperty(0,"6");
person.setProperty(1,1);
person.setProperty(3,"1");
person.setProperty(4,"1");
person.setProperty(5,"1");
//建立webservice连接对象
HttpTransportSEtransport=newHttpTransportSE(AgbcApi.GRADESERVICEURL,5000);//5秒超时
transport.debug=true;//是否是调试模式
//设置连接参数
SoapObjectsoapObject=newSoapObject(AgbcApi.NAMESPACE,methodName);
PropertyInfoobjekt=newPropertyInfo();
objekt.setName("arg0");//这个arg0很重要,不能是其他的东西,只能是arg0,不要问我为何,不然你就永远接受不了参数,因为是xml文档类型的东西
objekt.setValue(person);
objekt.setType(TGrade.class);
soapObject.addProperty(objekt);
//设置返回参数
SoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope(SoapEnvelope.VER11);//soap协议版本必须用SoapEnvelope.VER11(Soap
envelope.dotNet=false;//注意:这个属性是对dotnetwebservice协议的支持,如果dotnet的webservice
envelope.bodyOut=transport;
Log.i("请求参数",soapObject.toString());
envelope.setOutputSoapObject(soapObject);//设置请求参数
envelope.addMapping(AgbcApi.NAMESPACE,"addGrade",TGrade.class);//传对象时必须,参数namespace是webservice中指定的,
(newMarshalBase64()).register(envelope);
try{
transport.call(soapAction,envelope);
if(envelope.bodyIninstanceofSoapFault){
Stringstr=((SoapFault)envelope.bodyIn).faultstring;
Log.i("空节点返回的东西",str);
}else{
//SoapObjectsb=(SoapObject)envelope.bodyIn;//服务器返回的对象存在envelope的bodyIn中
Objectobj=envelope.getResponse();//直接将返回值强制转换为已知对象
//Log.d("WebService","返回结果:"+obj.toString());
}
}
catch(IOExceptione){
e.printStackTrace();
}
catch(XmlPullParserExceptione){
e.printStackTrace();
}
catch(Exceptionex){
ex.printStackTrace();
}
returntrue;
上面是我亲手写的代码,若是没有明白小伙伴,给我留言我给你看看吧,注意请求网络不能放在主线程哦,不然要报错的
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!