Android WebService 客户端 之 andriod ksoap2 WebService 复杂对象参数

来源:互联网 发布:vpn淘宝怎么搜 编辑:程序博客网 时间:2024/05/29 17:51

关于WebService的话题,作为一个Java屌丝,我想也不用多说了。只要读者是做"码农"这行的基本手到擒来。那么做为一个对Android不是很了解的屌丝"攻城狮"来说!那么初学 Android 这块WebService绝对是痛苦的。想必读者和我一样!痛苦不堪.我不像其他高大上的java高手那样,轻巧的就搞定了,然后贴出需要读者煞费苦心去看,结果又走进了死胡同!本屌,因为公司任务,必须要做!结果整整苦逼了我两个星期,最终老天不负有心人.星期五下午临下班,终于得到结果.....好辛苦的工作!如果读者还不是"码农",本屌由衷说一句:学挖掘机去吧。好了,废话太多了!开始说说代码。

ps:本屌不是给大家写论文,所以不想给读者介绍什么WebService!想知道什么是WebService的百度之。以下代码中,并不是完全案例,而是Clint端的逻辑片段。读者Copy时,同时本屌也希望多看看注释.


开始苦逼之路:

  1. 天才第一步,先找雀氏纸尿布。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下载。
  2. 然后把jar包导入到工程,这里本屌不想多说.我用的是Android studio编译工具,好像有很多公司用的是Eclipse for andriod.如果读者不知道怎么把jar包导入到工程!还是老规矩,百度之。
  3. 上面的事情做完,那么接下来才是重头戏。1.熟悉,WebService的wsdl文档的内容..要熟悉到,知道你所需要命名空间和接口函数的入参和出参,如果入参和出参是复杂对象,那么也要知道对象在wsdl中的定义是什么。如果服务端是你的写的,那么这步就可以忽略。在definitions中可以找到命名空间。至于函数名和实例对象根据自己的需求寻找。
  4. 编写实体类                                                                                                                                                                                                                                                       
    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>
  5. 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();        }    }}                                                                                                                                              
  6. 公司项目中也用了这块代码,所以不能全贴。以上代码,尽本人测试无数次,没有问题,如果读者套用到自己的工程中,出现逻辑异常,那么请仔细看看本屌所写的注释。
0 0
原创粉丝点击