AndroID通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍
最近在学校搞点东西,搞了2天的webservice,心累呀,今天中午和小伙伴终于弄通了,感觉就是一些细节问题没有注意到,啊,我的时间呀,进这么过去了,为了不让小伙伴们走弯路,我还是认真的把开发文档写一遍吧!
首先,如果我们要用CXF发布webservice用自定义类型的对象来当参数传递的话,我们应该先把这个类序列化一遍,下面就是我测试的代码,我创建了一个TGrade类,实现了KvmSerializable接口,这个接口里面的三个方法,这个接口的好处在于不需要服务端在去反序列化实体对象了,
public class TGrade implements KvmSerializable { // FIElds private Integer GID; private Integer GMax; private Integer GMin; private String Gname; private String GPic; private String GType; // Constructors /** default constructor */ public TGrade() { } /** minimal constructor */ public TGrade(Integer GMax) { this.GMax = GMax; } /** full constructor */ public TGrade(Integer GMax,Integer GMin,String Gname,String GPic,String GType) { this.GMax = GMax; this.GMin = GMin; this.Gname = Gname; this.GPic = GPic; this.GType = GType; } // Property accessors public Integer getGID() { return this.GID; } public voID setGID(Integer GID) { this.GID = GID; } public Integer getGMax() { return this.GMax; } public voID setGMax(Integer GMax) { this.GMax = GMax; } public Integer getGMin() { return this.GMin; } public voID setGMin(Integer GMin) { this.GMin = GMin; } public String getGname() { return this.Gname; } public voID setGname(String Gname) { this.Gname = Gname; } public String getGPic() { return this.GPic; } public voID setGPic(String GPic) { this.GPic = GPic; } public String getGType() { return this.GType; } public voID setGType(String GType) { this.GType = GType; } @OverrIDe public Object getProperty(int arg0) { switch (arg0) { case 0: return GID; case 1: return GMax; case 2: return GMin; case 3: return Gname; case 4: return GPic; case 5: return GType; default: break; } return null; } @OverrIDe public int getPropertyCount() { // Todo auto-generated method stub return 6;//y要注意这里,必须等于参数的个数,不然服务端没有办法接受有些参数 } @OverrIDe public voID getPropertyInfo(int arg0,Hashtable arg1,PropertyInfo arg2) { switch (arg0) { case 0: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GID"; break; case 1: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GMax"; break; case 2: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GMin"; break; case 3: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "Gname"; break; case 4: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GPic"; break; case 5: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GType"; break; default: break; } } @OverrIDe public voID setProperty(int arg0,Object arg1) { switch (arg0) { case 0: GID=Integer.parseInt(arg1.toString()); break; case 1: GMax=Integer.parseInt(arg1.toString()); break; case 2: GMin=Integer.parseInt(arg1.toString()); break; case 3: Gname=arg1.toString(); break; case 4: GPic=arg1.toString(); break; case 5: GType=arg1.toString(); break; default: break; } } } //-----------------------------下面是我测试部分的代码,这部分代码很重要,需要认真的看,我也写的比较详细,代码的世界模糊不得 public boolean addMaintenanceInfo() { String methodname = "addGrade";//服务端的方法 String soapAction =“http://10.127.80.67/gbckf/AndroID/GradeService”+methodname; TGrade person = new TGrade(); person.setProperty(0,"6"); person.setProperty(1,1); person.setProperty(3,"1"); person.setProperty(4,"1"); person.setProperty(5,"1"); // 建立webservice连接对象 httpTransportSE transport = new httpTransportSE(AgbcAPI.GRADESERVICEURL,5000);//5秒超时 transport.deBUG = true;// 是否是调试模式 // 设置连接参数 SoapObject soapObject = new SoapObject(AgbcAPI.nameSPACE,methodname); PropertyInfo objekt = new PropertyInfo(); objekt.setname("arg0");//这个arg0很重要,不能是其他的东西,只能是arg0,不要问我为何,不然你就永远接受不了参数,因为是xml文档类型的东西 objekt.setValue(person); objekt.setType(TGrade.class); soapObject.addProperty(objekt); // 设置返回参数 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(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中指定的, (new MarshalBase64()).register(envelope); try { transport.call(soapAction,envelope); if(envelope.bodyIn instanceof SoapFault){ String str = ((SoapFault) envelope.bodyIn).faultstring; Log.i("空节点返回的东西",str); }else { // SoapObject sb = (SoapObject)envelope.bodyIn;//服务器返回的对象存在envelope的bodyIn中 Object obj = envelope.getResponse();// 直接将返回值强制转换为已知对象 //Log.d("WebService","返回结果:" + obj.toString()); } } catch (IOException e) { e.printstacktrace(); } catch (XmlPullParserException e) { e.printstacktrace(); } catch (Exception ex) { ex.printstacktrace(); } return true;
上面是我亲手写的代码,若是没有明白小伙伴,给我留言我给你看看吧,注意请求网络不能放在主线程哦,不然要报错的
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
总结以上是内存溢出为你收集整理的Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍全部内容,希望文章能够帮你解决Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)