Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍
发布时间 - 2026-01-10 23:15:48 点击率:次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传递
# Android通过ksoap2传递数据详解
# ksoap2
# 在Android中访问WebService接口的方法
# Android开发调用WebService的方法示例
# Android 中利用 ksoap2 调用 WebService的示例代码
# Android ksoap调用webservice批量上传多张图片详解
# Android 通过webservice上传多张图片到指定服务器详解
# 在Android中调用WebService实例
# Android通过Webservice操作sqlserver数据库实例代码
# android调用WebService实例分析
# android中soap协议使用(ksoap调用webservice)
# android调用webservice接口获取信息
# 服务端
# 一遍
# 很重要
# 小伙伴
# 我也
# 文档
# 序列化
# 放在
# 你就
# 不需要
# 其他的
# 问我
# 这部
# 要注意
# 希望能
# 走弯路
# 注意到
# 要用
# 就是我
# 自定义
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
Laravel如何与Pusher实现实时通信?(WebSocket示例)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
php打包exe后无法访问网络共享_共享权限设置方法【教程】
如何在阿里云ECS服务器部署织梦CMS网站?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
网站页面设计需要考虑到这些问题
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
北京的网站制作公司有哪些,哪个视频网站最好?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何快速搭建FTP站点实现文件共享?
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
如何快速完成中国万网建站详细流程?
如何制作一个表白网站视频,关于勇敢表白的小标题?
Laravel安装步骤详细教程_Laravel环境搭建指南
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
香港服务器租用每月最低只需15元?
如何在腾讯云服务器上快速搭建个人网站?
香港服务器租用费用高吗?如何避免常见误区?
Laravel怎么实现验证码(Captcha)功能
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
Mybatis 中的insertOrUpdate操作
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Angular 表单中正确绑定输入值以确保提交与验证正常工作
怎样使用JSON进行数据交换_它有什么限制
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
Python数据仓库与ETL构建实战_Airflow调度流程详解
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Android使用GridView实现日历的简单功能
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
Laravel storage目录权限问题_Laravel文件写入权限设置
javascript读取文本节点方法小结
免费网站制作appp,免费制作app哪个平台好?
WordPress 子目录安装中正确处理脚本路径的完整指南
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
iOS发送验证码倒计时应用
如何在IIS中新建站点并配置端口与物理路径?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
高端网站建设与定制开发一站式解决方案 中企动力
如何在阿里云虚拟服务器快速搭建网站?
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】

