Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍
程序员文章站
2023-12-18 19:20:58
android通过ksoap2传递复杂数据类型及cxf发布的webservice详细介绍
最近在学校搞点东西,搞了2天的webservice,心累呀,今天中午...
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;
上面是我亲手写的代码,若是没有明白小伙伴,给我留言我给你看看吧,注意请求网络不能放在主线程哦,不然要报错的
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!