Android使用Ksoap2调用Webservice最详细说明文档

       第一次遇到soap协议的请求,查了很多资料,尝试了很多次,在最后终于功夫不负有心人,终于调用成功,决定写一篇帖子记录一下,方便以后再次遇到后可以很快想起使用方法。

一、首先要导入Ksoap的jar包

Ksoap下载链接
下载之后放到lib文件夹下,并添加到依赖。

二、开始使用

这里分别介绍两种用法,一种是单一请求参数的简单用法,另一种是将参数封装成对象的方法。

1.单一参数请求

话不多说,直接上代码

// Webservice服务器地址
private static final String SERVER_URL = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";
// 调用的webservice命令空间
private static final String PACE = "http://WebXml.com.cn/";
// 获取天气详情的方法名
private static final String W_NAME = "getWeatherbyCityName";
/**
*city 需要查询的城市
*/
public void static getCityWeather(String city){
    SoapObject soapObject = new SoapObject(PACE, W_NAME);
    soapObject.addProperty("theCityName",city);
    final SoapSerializationEnvelope serializa = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);
    serializa.bodyOut =soapObject;
    serializa.dotNet =true;
    HttpTransportSE httpSe = new HttpTransportSE(SERVER_URL);
    httpSe.debug =true;
    httpSe.call(PACE+W_NAME,serializa);
    SoapObject result = (SoapObject) serializa.bodyIn;
}

这种方式很简单,以上代码即可请求成功得到一个SoapObject 的对象,然后创建一个对应的天气对象去解析出数据即可,这里可以使用Android自带的pull解析器解析SoapObject 中的xml数据。

对了,写到此处我需要介绍一款好用soap测试工具软件,SoapUI,可以自行搜索下载。

SoapUI界面.png

界面是这样的,将server的url粘进去就可以看见所有方法名,参数名,还可以模拟请求,很方便。

2.多参数封装成对象请求

  • 创建请求对象实体
public class SoapTestRequest implements KvmSerializable {
    private String productID;
    private String timeStamp;
    private String transactionID;
    private String userID;
    private int userIDType;
    private String userToken;

此处需要实现KvmSerializable,然后复写以下几个方法

 @Override
    public Object getProperty(int arg0) {
        switch (arg0) {
            case 0:
                return productID;
            case 1:
                return timeStamp;
            case 2:
                return transactionID;
            case 3:
                return userID;
            case 4:
                return userIDType;
            case 5:
                return userToken;
            default:
                break;
        }

        return null;
    }

    @Override
    public int getPropertyCount() {
        return 6;
    }

    @Override
    public void setProperty(int arg0, Object arg1) {
        switch (arg0) {
            case 0:
                productID = arg1.toString();
                break;
            case 1:
                timeStamp = arg1.toString();
                break;
            case 2:
                transactionID = arg1.toString();
                break;
            case 3:
                userID = arg1.toString();
                break;
            case 4:
                userIDType = (int) arg1;
                break;
            case 5:
                userToken = arg1.toString();
                break;
            default:
                break;
        }
    }

    @Override
    public void getPropertyInfo(int arg0, Hashtable hashtable, PropertyInfo propertyInfo) {
        switch (arg0) {
            case 0:
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                propertyInfo.name = "productID";
                break;
            case 1:
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                propertyInfo.name = "timeStamp";
                break;
            case 2:
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                propertyInfo.name = "transactionID";
                break;
            case 3:
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                propertyInfo.name = "userID";
                break;
            case 4:
                propertyInfo.type = PropertyInfo.INTEGER_CLASS;
                propertyInfo.name = "userIDType";
                break;
            case 5:
                propertyInfo.type = PropertyInfo.STRING_CLASS;
                propertyInfo.name = "userToken";
                break;
            default:
                break;
        }
    }

按照上述方式设置相关Property属性,当然后可能还需要get/set方法和toString方法,自行添加。

  • 发起请求
    这里的步骤和第一种方法就差不多了,还是直接上代码吧
public static void getAuthontication() {
        String nameSpace = "http://ip:port/";
        String methodName = "serviceAuth";
        String soapAction = "http://ip:port/serviceAuth";

        String url = "http://ip:port/services/server?wsdl";// 后面加不加那个?wsdl参数影响都不大

        SimpleDateFormat format = new SimpleDateFormat();
        format.applyPattern("yyyyMMddHHmmss");
        final String now = format.format(new Date());

        SoapRequest request = new SoapRequest("productID11111",
                now,"12345678","ssss11",5,"13333333");
//此处使用以下方式给SoapRequest 传参也是也可以的
//        request.setProperty(1, "productID1111");
//        request.setProperty(2, now);
//        request.setProperty(3, "12345678");
//        request.setProperty(4, "sss1111");
//        request.setProperty(5, 5);
//        request.setProperty(6, "13333333");
        // 建立webservice连接对象
        HttpTransportSE httpTransportSE = new HttpTransportSE(url);
        // 是否是调试模式
        httpTransportSE.debug = true;

        // 设置连接参数
        SoapObject soapObject = new SoapObject(nameSpace, methodName);
        PropertyInfo objekt = new PropertyInfo();
        objekt.setName("requ");//这个名字可以在SoapUI中找到,xml中包裹参数在最外层的属性名
        objekt.setValue(request);
        objekt.setType(request.getClass());
        soapObject.addProperty(objekt);

        // 设置返回参数
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);// soap协议版本必须用SoapEnvelope.VER11(Soap
        // V1.1)
        envelope.dotNet = true;// 注意:这个属性是对dotnetwebservice协议的支持,如果dotnet的webservice
        // 不指定rpc方式则用true否则要用false
        envelope.bodyOut = httpTransportSE;
        envelope.setOutputSoapObject(soapObject);// 设置请求参数
//      new MarshalDate().register(envelope);
        envelope.addMapping(nameSpace, "SoapRequest", request.getClass());// 传对象时必须,参数namespace是webservice中指定的,

        // claszz是自定义类的类型
        try {
            httpTransportSE.call(soapAction, envelope);
            // 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();
        }
}

还是返回的是一个SoapObject对象,解析和上面一样,自己处理,就不过多的赘述了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,034评论 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,102评论 1 45
  • 晚上腿抽筋,腿疼的不能自己,蜷缩着身子,心里难受的不行!现在心里最期望的就是有个男人在我身边给我揉揉腿……可现实告...
    班若波阅读 576评论 6 3
  • 读的是别人书,解得却是自己的累积。从初读《论语新解》,到回归《论语》本身,都让我感悟颇多! 曾子曰:“...
    张林姣阅读 275评论 0 0
  • 七律/石斛兰 作者:心博、图片:网络 林兰黄草千年润,或谓金钗万丈须。 怪状根茎当品味,奇形花貌可觇觎。 容颜俏丽...
    心博1阅读 867评论 0 0