Android调用webservice总结

1、webservice简介

https://www.cnblogs.com/jpfss/p/8397596.html

Web Services 是应用程序组件,使用开放协议进行通信,是独立的(self-contained)并可自我描述,可通过使用UDDI来发现,可被其他应用程序使用(跨平台性),XML 是 Web Services 的基础。
基础的WebService平台是XML+HTTP

  • SOAP (简易对象访问协议)
  • UDDI (通用描述、发现及整合)
  • WSDL (Web services 描述语言)
    在这里插入图片描述

2、获取webservice服务

注意:部分接口现在收费了。

http://www.webxml.com.cn/zh_cn/index.aspx

http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

20多个常用的免费WebService接口

3、ksoap2-android jar包

首先如果想在Android平台上调用WebService需要依赖于第三方类库:ksoap2 而在Android平台上,使用的是ksoap2 Android,一个高效,轻量级的SOAP开发包!

jar包下载地址:https://code.google.com/archive/p/ksoap2-android/downloads

这里提供两个百度云的链接供大家下载使用:

2.54版本:ksoap2-android 2.54.jar

3.30版本:ksoap2-android 3.30.jar

4、使用总结

4.1、配置参数获取

例如:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

在URL后面加上 ?wsdl 可以查看节点信息,例如:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

在这里插入图片描述
在URL节点信息中可以查看Namespace和soap版本信息。

进入具体方法中,例如:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getSupportCity
可以查看调用这个方法的具体参数和支持的调用方式。

在这里插入图片描述

4.2、soap版本区分

soap11需要填写SOAPAction(Namespace + MethodName);
soap12不需要填写SOAPAction;

通过下图对比一下:
在这里插入图片描述
在这里插入图片描述

个人理解,高版本向下兼容,虽然?wsdl节点信息显示,使用的是soap12;但是指定soap11依然可以调用,调用的时候需要传递SOAPAction参数。

SOAP11调用方式:

    public static void callService11(String url,  String namespace,  String methodName, String param) throws IOException, XmlPullParserException {
        // 创建SoapObject对象
        SoapObject soapObject = new SoapObject(namespace, methodName);

        // SoapObject添加参数
        soapObject.addProperty("byProvinceName", param);

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        soapEnvelope.bodyOut = soapObject;
        //webservice是否用.net开发
        soapEnvelope.dotNet = true;

        // 创建HttpTransportSE对象,传递WebService服务器地址
        HttpTransportSE httpTransportSE = new HttpTransportSE(url);

        httpTransportSE.call(namespace + methodName, soapEnvelope);
        SoapObject resultSoapObject = (SoapObject) soapEnvelope.bodyIn;
    }

SOAP12调用方式:

    public static void callService12(String url, String namespace, String methodName, String param) throws IOException, XmlPullParserException {
        // 创建SoapObject对象
        SoapObject soapObject = new SoapObject(namespace, methodName);

        // SoapObject添加参数
        soapObject.addProperty("byProvinceName", param);

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);

        soapEnvelope.bodyOut = soapObject;
        //webservice是否用.net开发
        soapEnvelope.dotNet = true;

        // 创建HttpTransportSE对象,传递WebService服务器地址
        HttpTransportSE httpTransportSE = new HttpTransportSE(url);

        httpTransportSE.call(null, soapEnvelope);
        SoapObject resultSoapObject = (SoapObject) soapEnvelope.bodyIn;
    }

4.3、解析XML返回值(SoapObject解析)

4.3.1、概述:

SoapObject类是一个主要用于调用WCF服务的类,其对象可以作为请求,发送到WCF服务器;也可以用于存储响应信息。

该对象本身是一个存储了一套HTML语句的文本。而SoapObject本身提供了对这套HTML语句的解析。

我们对SoapObject的解析,其实可以理解为对HTML语句的解析。

本文以String类型为获取目标(即从WCF服务器提供方法返回的是String类型的数据)

首先我们把返回的String类型分成三种情况:单一个String, 一个String的数组,一个String的二维数组。

①对于单一个String,我们在编写调用WCF服务的方法的时候,envelope.bodyIn就不能强制转换成SoapObject,否则会在运行时提示类型转换错误。此时envelope.bodyIn可以直接作为一个Object对象返回,也可以调用其toString()方法,即可获得想要的数据。

②对于一个String的一维数组,我们要把envelope.bodyIn强制转换成SoapObject,获取一个SoapObject类型的对象soap。

此时,只要调用SoapObject的getProperty()方法即可获得想要的数据,参数对应一维数组下标。

例如:要从返回一维数组获取第一个元素,只要调用soap.setProperty(0)即可。

③对于一个String的二维数组。

此时。通过调试发现,getProgerty()方法返回的是另一个SoapObject对象,因此我们可以把envelope.bodyIn的SoapObject对象想象成一个二维数组,其中getProperty()方法是返回一维数组的某一行,参数是对应行下标,再通过调用这一个SoapObject的getProperty()方法,即可获取某一元素。

例如:要获取String[0][1]元素,只要从envelope.bodyIn的SoapObject调用两次getProperty()方法:soap.getProperty(0).getProperty(1)

4.3.2、返回值是String数组时:

在这里插入图片描述
解析数据:

    /**
     * 解析SoapObject对象
     *
     * @param result
     * @return
     */
    private List<String> parseSoapObject(SoapObject result) {
        List<String> list = new ArrayList<String>();
        SoapObject provinceSoapObject = (SoapObject) result.getProperty("getSupportProvinceResult");
        if (provinceSoapObject == null) {
            return null;
        }
        for (int i = 0; i < provinceSoapObject.getPropertyCount(); i++) {
            list.add(provinceSoapObject.getProperty(i).toString());
        }
        return list;
    }

4.3.3、返回值是个String时:
在这里插入图片描述

解析数据:

 //拿到响应体
 SoapObject response = (SoapObject) envelope.bodyIn;
 //取数据
 String data = response.getProperty("toTraditionalChineseResult").toString();

4.3.4、如果返回值是json格式:

在这里插入图片描述
解析数据:

SoapObject resultSoapObject = (SoapObject) soapEnvelope.bodyIn;
String jsonStr= resultSoapObject.getProperty(0).toString();
JsonParser parser = new JsonParser();
sonObject jsonObj = parser.parse(jsonStr).getAsJsonObject();
List<MasterDynamic> newMasterDynamicList = GsonUtil.parserJsonArrToBeans(jsonObj.getAsJsonArray("data"), MasterDynamic.class);

4.4、使用SoapUI调试工具

SoapUI官网下载 (选择openResource免费版)

webservice接口测试,使用SoapUI工具进行接口测试

5、Demo

webServiceDemo

参考链接:

猜你喜欢

转载自blog.csdn.net/zhijiandedaima/article/details/86519798
今日推荐