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;
上面是我亲手写的代码,若是没有明白小伙伴,给我留言我给你看看吧,注意请求网络不能放在主线程哦,不然要报错的
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!