Android WebService 客户端 之 andriod ksoap2 WebService 复杂对象参数
来源:互联网 发布:vpn淘宝怎么搜 编辑:程序博客网 时间:2024/05/29 17:51
关于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 属性的个数 */ @Override public int getPropertyCount() { return 2; } @Override public 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; } } @Override public void setProperty(int i, Object o) { switch (i) { case 0: name = o.toString(); break; case 1: num = o.toString(); break; default: break; } } @Override public 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); //设置在通讯传输数据时,是否支持debug transport.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(); } }}
- 公司项目中也用了这块代码,所以不能全贴。以上代码,尽本人测试无数次,没有问题,如果读者套用到自己的工程中,出现逻辑异常,那么请仔细看看本屌所写的注释。
0 0
- Android WebService 客户端 之 andriod ksoap2 WebService 复杂对象参数
- android客户端传递复杂参数给webservice
- xfire生成webservice,Android利用ksoap2访问webservice 之 客户端搭建
- 关于android中webservice使用ksoap2传递复杂对象的研究
- android ksoap2调用webservice
- Android基于ksoap2的WebService通信客户端demo
- Axis2 webservice客户端(wsdd)复杂对象
- android引用Ksoap2调用webservice
- Android利用KSOAP2调用webservice
- Android采用KSOAP2访问webservice
- Android使用ksoap2 调用 WebService
- android ksoap2调用cxf webservice
- android ksoap2调用cxf webservice
- Android使用ksoap2调用webservice
- Android通过ksoap2传递复杂数据类型,服务端为CXF发布的webservice,亲手写的代码
- xfire生成webservice,Android利用ksoap2访问webservice 之 服务器搭建
- Android使用ksoap2-android调用WebService学习
- Android使用ksoap2-android调用WebService学习
- SpringMVC 深度解析@RequestMapping(一)
- 字节对齐
- 数据挖掘的本质
- 2.当vmware中的Linux磁盘大小不足了的时候,修改vmware中Linux磁盘空间大小的解决方案
- java垃圾回收之Minor GC和Major GC
- Android WebService 客户端 之 andriod ksoap2 WebService 复杂对象参数
- Clubof.net 最大的开源IT社区
- 01 Java体系
- C++Primer3.5.3练习题。
- 雷军万字演讲稿全文:我看未来20年
- HDU 3350 #define is unsafe 栈的模拟题
- day74,page90
- 用X来求Y的值
- live555搭建流媒体服务器2--live555源码分析2