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;
上面是我亲手写的代码,若是没有明白小伙伴,给我留言我给你看看吧,注意请求网络不能放在主线程哦,不然要报错的
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
问题内容: 有没有人能够通过https使用ksoap2 android连接到Soap服务器? 我不断收到“主机名<###>未被验证”的错误 我正在做 显然回头看看不是kandroid的其他ksoap,您可以通过https连接到我们的电话,但我找不到在android版本中做到这一点的方法。 是否有人找到或知道要使用的通话方式? 谢谢你的帮助 问题答案: android ksoap2 2.5.2已
本文向大家介绍Lua中的基本数据类型详细介绍,包括了Lua中的基本数据类型详细介绍的使用技巧和注意事项,需要的朋友参考一下 基础介绍 Lua是一种动态类型的语言。在语言中没有类型定义的语法,每个值都带有其自身的类型信息。在Lua中有8中基本类型,分别是: 1.nil(空)类型 2.boolean(布尔)类型 3.number(数字)类型 4.string(字符串)类型 5.userdata(自定义
本文向大家介绍java 中函数的参数传递详细介绍,包括了java 中函数的参数传递详细介绍的使用技巧和注意事项,需要的朋友参考一下 java中函数的参数传递 总结: 1.将对象(对象的引用)作为参数传递时传递的是引用(相当于指针)。也就是说函数内对参数所做的修改会影响原来的对象。 2.当将基本类型或基本类型的包装集作为参数传递时,传递的是值。也就是说函数内对参数所做的修改不会影响原来的变
本文向大家介绍Android ADB详细介绍及用法,包括了Android ADB详细介绍及用法的使用技巧和注意事项,需要的朋友参考一下 Android ADB 用法 adb 全称是 Android Debug Bridge, 就是起到调试桥的作用。 用来操作android设备的 阅读目录 adb 有什么用 adb 下载 adb devices adb install (安装软件) adb
主要内容:本节引言:,1.Intent传递简单数据,2.Intent传递数组,3.Intent传递集合,4.Intent传递对象,5.Intent传递Bitmap,6.传来传去不方便,直接定义全局数据,7.单例模式传参,本节小结:本节引言: 上一节中我们学习了Intent的一些基本使用,知道了Intent的七个属性,显式Intent以及 隐式Intent,以及如何自定义隐式Intent,最后还给大家提供了一些常用的系统Intent! 而本节跟大家讲解的是Intent传递数据的问题~好的,开始本节
布尔值类型的数据表示逻辑运算结果,有两种取值: 真,使用 True 关键字表示。 假,使用 False 关键字表示。 1. 比较运算 Python 提供了 6 种比较运算用于比较数值大小,如下所示: 运算符 功能描述 > 大于 >= 大于或者等于 == 等于 != 不等于 < 小于 <= 小于等于 比较运算的结果返回 True 或者 False,如下所示: >>> 2 > 1 True >>> 2
本文向大家介绍Android NDK开发详细介绍,包括了Android NDK开发详细介绍的使用技巧和注意事项,需要的朋友参考一下 Android之NDK开发 一、NDK产生的背景 Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能
本文向大家介绍HTTPS 通信原理及详细介绍,包括了HTTPS 通信原理及详细介绍的使用技巧和注意事项,需要的朋友参考一下 HTTPS 通信原理 Https是基于安全目的的Http通道,其安全基础由SSL层来保证。最初由netscape公司研发,主要提供了通讯双方的身份认证和加密通信方法。现在广泛应用于互联网上安全敏感通讯。 我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行