Android WebService 客户端 之 andriod ksoap2 WebService 复杂对象参数
关于WebService的话题,作为一个Java屌丝,我想也不用多说了。只要读者是做"码农"这行的基本手到擒来。那么做为一个对Android不是很了解的屌丝"攻城狮"来说!那么初学 Android 这块WebService绝对是痛苦的。想必读者和我一样!痛苦不堪.我不像其他高大上的java高手那样,轻巧的就搞定了,然后贴出需要读者煞费苦心去看,结果又走进了死胡同!本屌,因为公司任务,必须要做!结果整整苦逼了我两个星期,最终老天不负有心人.星期五下午临下班,终于得到结果.....好辛苦的工作!如果读者还不是"码农",本屌由衷说一句:学挖掘机去吧。好了,废话太多了!开始说说代码。
ps:本屌不是给大家写论文,所以不想给读者介绍什么WebService!想知道什么是WebService的百度之。以下代码中,并不是完全案例,而是Clint端的逻辑片段。读者Copy时,同时本屌也希望多看看注释.
开始苦逼之路:
- 天才第一步,先找雀氏纸尿布。Android,貌似没有实现WebService的功能,我也不确定,反正我没有手写客户端的习惯。如果读者喜欢,那就自己动手吧。Googlo已经给Android WebService 客户端提供了Ksoap2-Android的项目。因此,我们的客户端需要导入Ksoap2的jar包。至于那些Asix1 、2,xfire、cfx那些,亲,我只能告诉你,那些包太多了,手机资源有限。所以我们用Ksoap2的jar包。下载地址:https://code.google.com/p/ksoap2-android/source/browse/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly (个人建议:请使用翻墙工具,因为这是国外的网站,原因:保密。因为我是少先队队员),打开后,在页面找到Directoris字样,选择你喜欢的Ksoap2的版本。本屌使用了2.5.4 (没法,上司要求,不能用太新,不过我自己偷偷试了一下最新的,基本没有问题。)然后再filename中选择对应的jar下载。
- 然后把jar包导入到工程,这里本屌不想多说.我用的是Android studio编译工具,好像有很多公司用的是Eclipse for andriod.如果读者不知道怎么把jar包导入到工程!还是老规矩,百度之。
- 上面的事情做完,那么接下来才是重头戏。1.熟悉,WebService的wsdl文档的内容..要熟悉到,知道你所需要命名空间和接口函数的入参和出参,如果入参和出参是复杂对象,那么也要知道对象在wsdl中的定义是什么。如果服务端是你的写的,那么这步就可以忽略。
在definitions中可以找到命名空间。至于函数名和实例对象根据自己的需求寻找。
- 编写实体类
package com.pki.g4b.testinter.webservice;import org.ksoap2.serialization.KvmSerializable; import org.ksoap2.serialization.PropertyInfo;import java.util.Hashtable;/*** Created by Administrator on 2014/11/4.*/ public class UserInfo implements KvmSerializable {private String name;private String num;/*** 获取实体类属性的个数(这里返回的个数,必须和属性的个数一致,不然会导致Servre端获取不到参数)* @return 属性的个数*/@Overridepublic int getPropertyCount() {return 2;}@Overridepublic void getPropertyInfo(int i, Hashtable hashtable, PropertyInfo propertyInfo) {switch (i) {case 0:propertyInfo.type = PropertyInfo.STRING_CLASS;propertyInfo.name = "name";break;case 1:propertyInfo.type = PropertyInfo.STRING_CLASS;propertyInfo.name = "num";break;default:break;}}@Overridepublic void setProperty(int i, Object o) {switch (i) {case 0:name = o.toString();break;case 1:num = o.toString();break;default:break;}}@Overridepublic Object getProperty(int i) {switch (i) {case 0:return name;case 1:return num;default:return null;}} }<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
import android.util.Log;import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.PropertyInfo; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE;/*** Created by Administrator on 2014/11/3.*/ public class TestClinet {//webservice 命名空间private static final String SERVICE_NAMESPACE = "http://service.ra.tca.topca.cn/";//webservice URL地址private static String SERVICE_URL = "WebService地址本屌不能提供,屌丝也有职业操守";//webservice 接口名private static final String METHOD_NAME = "接口名称本屌不能提供,屌丝也有职业操守"; </span>public void getCertInfo(String subject) {CA_CSR ca = new CA_CSR();try {//指定webservice,Soap的请求对象//傻瓜理解方式:获取 namespace = SERVICE_NAMESPACE 的wsdl文档中,operation 节点// name = METHOD_NAME的函数,且转换成SoapObject对象。SoapObject request = new SoapObject(SERVICE_NAMESPACE, METHOD_NAME);//设置函数的入参//设置对象参数:第一种方式/*SoapObject userInfo = new SoapObject(SERVICE_NAMESPACE,"userInfo");userInfo.addProperty("name","test");userInfo.addProperty("num","test@163.com");request.addProperty("userInfo", userInfo);*///设置对象参数:二种方式 1.初始化实体类UserInfo userInfo = new UserInfo();userInfo.setProperty(1,"test");userInfo.setProperty(4,"test@163.com");//2.将对象参数设置到Soap属性信息对象中PropertyInfo property = new PropertyInfo();//setName:userInfo必须对应WSDL文档中的形参property.setName("userInfo");//setValue:userInfo为实参property.setValue(userInfo);//将Soap属性信息对象加载到Soap的请求对象中request.addProperty(property);//对应接口的入参名称,与接口参数循序无关,名称对应即可request.addProperty("id", "test_id_No1");//初始化序列化的Envelope(信封)对象。//SoapEnvelope.VER11 需对应服务端的Soap版本号(至于怎么查询,本屌还不知道,我调用的也是// 别人公司的WebService,人家告诉我的.)SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.bodyOut = request;//dotNet这里要密切注意,本屌在这里被坑到晕头转向。// envelope.dotNet = true;那么服务端将接受不到参数值,至于为什么本屌大胆放肆的想//在调用.Net服务端是使用envelope.dotNet = true;调用非.Net服务端时用false;这个理论//还未证实,等我有空会实验的.envelope.dotNet = false;envelope.setOutputSoapObject(request);//Android HTTP传输对象//不要再用AndroidHttpTransport,这是一个过期的类 。在Ksoap2最新版中已经没有这个类了HttpTransportSE transport = new HttpTransportSE(SERVICE_URL);//设置在通讯传输数据时,是否支持debugtransport.debug = false;Log.i("test info messge", "begin call......");transport.call(SERVICE_NAMESPACE + METHOD_NAME, envelope);Log.d("************* result is :", envelope.bodyIn.toString());Log.i("test info messger", "end call......");} catch (Exception e) {e.printStackTrace();}}}
- 公司项目中也用了这块代码,所以不能全贴。以上代码,尽本人测试无数次,没有问题,如果读者套用到自己的工程中,出现逻辑异常,那么请仔细看看本屌所写的注释。
Android WebService 客户端 之 andriod ksoap2 WebService 复杂对象参数相关推荐
- WebService客户端添加SOAPHeader信息
WebService客户端添加SOAPHeader信息 通过JAXBContext创建Marshaller对头信息进行解析为dom,获取WSBindingProvider,使用Headers.crea ...
- webservice客户端开发
一.根据约定条件生成客户端 1.需要axis.jar包 2.调用 import org.apache.axis.client.Call; import org.apache.axis.client.S ...
- 如何使用soapUI模拟webservice客户端发送请求
随着软件行业的发展,一个完成的系统已经不能使用简单的项目来完成,而是有多个项目之间相互协同工作,项目之间就需要进行即时通讯,现在比较流行的通讯方式是通过webservice服务.比较流程的webser ...
- 基于Axis服务端的webservice客户端实现
之前开发webservice客户端的时候遇到一个使用Axis2开发接口的厂家,查资料把Axis1和Axis2客户端的开发方式总结如下: 基于Axis1服务端的客户端实现: /*** 使用Axis Ca ...
- WebService客户端开发(Axis2 1.5)
WebService的客户端开发方式很多,如果单纯为了使用一个WebService,而不想依赖太多的框架,那么随便选择个WebService框架就可以了. 为了封装方便,代码复用,更好的性能,一般选择 ...
- Java笔记-JDK搭建WebService客户端其他调用方法
项目如下 这里大部分代码和第一个客户端一样. package webservice.client;import webservice.WeatherServiceImpl;import javax.x ...
- 13.Axis创建webservice客户端和服务端
转自:https://blog.csdn.net/chenghui0317/article/details/9318317 一.Axis的介绍 Web Service是现在最适合实现SOA的技术,而A ...
- cmd命令生成webservice_根据wsdl文件生成WebService客户端代码
有时候在项目中,一个项目可能有好几个公司在做.系统之间难免会出现互相调用接口的现象,这时候有一种办法就是使用webService.本篇文章将介绍如何将对接系统提供的WebService接口,根据对方提 ...
- WebService客户端三种调用方式整理
1 WebService基础 1.1 作用 1, WebService是两个系统的远程调用,使两个系统进行数据交互,如应用: 天气预报服务.银行ATM取款.使用邮箱账号登录各网站等. 2, ...
最新文章
- 收藏 | 有哪些相见恨晚的科研经验?
- linux获取fifo中的数据数量,Linux select()和多个套接字的FIFO排序?
- Neighbor2Neighbor: Self-Supervised Denoising from Single Noisy Images
- oracle误删表空间 无法关闭,oracle 误删表空间文件启动不了数据库的解决办法
- 管理信息系统的开发和管理
- 使用过滤统计信息解决基数预估错误
- vue上传文件php,php文件上传 – 前端开发,JQUERY特效,全栈开发,vue开发
- mysql映射超_Hibernate的映射类型 hibernate mysql映射类型
- 【 HDU - 2594 】Simpsons’ Hidden Talents(KMP应用,求最长前缀后缀公共子串)
- VBA SQL查询-记录集转数组
- c语言统计输入的字符数字的个数字,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
- Angular Service
- 程序员输入法_解决Pycharm输入法不跟随光标
- mysql mha reference_MySQL MHA配置常见问题
- cactus java_Cactus入门
- 《软件体系结构》第三章 软件体系结构风格
- 在Ubuntu安装QT及相关环境配置
- python怎么把二维数组转化一维数组,python 二维数组转一维数组
- 如何增加百度收录量和友好度
- Python对象赋值和拷贝