Bootstrap

Android中webservice接口的调用

概述

WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台、不同语言、不同技术整合到一块。在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService。在Android中适合WebService的SDK有一些,比较常用的有Ksoap2,可以从我的资源https://download.csdn.net/download/wen_haha/10555744中进行下载。

调用webservice的方法

(1) 指定webservice的命名空间和调用的网址(我们这以调用天气的接口为例)

//网址url
public static final String WEB_SERVER_URL = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";
  
    // 命名空间
    private static final String NAMESPACE = "http://WebXml.com.cn/";

(2) 指定webservice调用的方法名

 public static final String METHOD = "getSupportCity";

(3) 设置调用方法的参数值,如果没有参数,可以省略,设置方法的参数值的代码

// 设置需调用WebService接口需要传入的参数
        rpc.addProperty("byProvinceName", "");

(4) 生成调用Webservice方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述

 // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.bodyOut = rpc;
        // 设置是否调用的是dotNet开发的WebService
        envelope.dotNet = true;  //true是.net false是java
        envelope.setOutputSoapObject(rpc);

(5) 创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的URL

HttpTransportSE transport = new HttpTransportSE(wsdlUrl);
        transport.debug = true;

(6)使用call方法调用WebService方法

// 调用WebService
            transport.call(action, envelope);

(7)使用getResponse方法获得WebService方法的返回结果

 // 获取返回的数据
            if (envelope.getResponse()!=null){
                SoapObject   object = (SoapObject) envelope.getResponse();
            }

效果图

示例代码

(1)第一种Webservice工具类中通过线程和handle实现,这种调用的时候就不需要在主线程中再开启线程了。

 public static final String WEB_SERVER_URL = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";
    // 含有3个线程的线程池
    private static final ExecutorService executorService = Executors.newFixedThreadPool(3);//限制线程池大小为3的线程池
    // 命名空间
    private static final String NAMESPACE = "http://WebXml.com.cn/";

    public static void callWebService(String url, final String methodName, HashMap<String,String> properties, final WebServiceCallBack webServiceCallBack){
        //创建HttpTransportSE对象,传递WebService服务器地址
        final HttpTransportSE httpTransportSE = new HttpTransportSE(url);
        //创建SoapObject对象
        final SoapObject soapObject = new SoapObject(NAMESPACE,methodName);
        //SoapObject添加参数
        if (properties != null){
            for (Iterator<Map.Entry<String,String>> it = properties.entrySet().iterator(); it.hasNext();){
                Map.Entry<String,String> entry = it.next();
                soapObject.addProperty(entry.getKey(),entry.getValue());
            }
        }
        //实例化SoapSerializationEnvelope,传入WebService的SOAP协议的版本号
        final SoapSerializationEnvelope soapSerializationEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        //设置是否调用的是.NET开发的WebService
        soapSerializationEnvelope.setOutputSoapObject(soapObject);
        soapSerializationEnvelope.dotNet = true;
        httpTransportSE.debug = true;

        //用于子线程与主线程通信的Handler
        final Handler mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //将返回值回调到callBack的参数中
                webServiceCallBack.callBack((SoapObject) msg.obj);
            }
        };
        //开启线程去访问WebService
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                SoapObject resultSoapObject = null;
                try {
                    httpTransportSE.call(NAMESPACE + methodName,soapSerializationEnvelope);
                    if (soapSerializationEnvelope.getResponse() != null){
                        //获取服务器响应返回的SoapObject
                        resultSoapObject = (SoapObject) soapSerializationEnvelope.bodyIn;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                }finally {
                    //将获取的消息通过handler发到主线程
                    mHandler.sendMessage(mHandler.obtainMessage(0,resultSoapObject));
                }
            }
        });
    }

    public interface WebServiceCallBack{
        public void callBack(SoapObject result);
    }

(2)这种Webservice工具类就是比较普通的了,在调用的时候需要在主线程中开始线程方能调用。

 // 命名空间
        String nameSpace = "http://WebXml.com.cn/";
        // 调用的方法名称
        String action=nameSpace+methodName;
        String wsdlUrl = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
        // 指定WebService的命名空间和调用的方法名
        SoapObject rpc = new SoapObject(nameSpace, methodName);
        // 设置需调用WebService接口需要传入的参数
        rpc.addProperty("byProvinceName", json);
        // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.bodyOut = rpc;
        // 设置是否调用的是dotNet开发的WebService
        envelope.dotNet = true;  //true是.net false是java
        envelope.setOutputSoapObject(rpc);
        HttpTransportSE transport = new HttpTransportSE(wsdlUrl);
        transport.debug = true;
        try {
            // 调用WebService
            transport.call(action, envelope);
            // 获取返回的数据
            if (envelope.getResponse()!=null){
                SoapObject   object = (SoapObject) envelope.getResponse();
                return object.toString();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

调用的方法就不贴出来了,到时候大家需要的话可以直接去我的demo中下载,这里的话,我推荐大家使用第一种方法。

注意事项

  1. 引用接口必须下载一个包 :ksoap2-android-assembly-2.5.2-jar-with-dependencies
  2. 要能成功调用接口获得数据还需要在AndroidManifest中添加访问网络的权限 
    <uses-permission android:name="android.permission.INTERNET"/>

Demo

https://download.csdn.net/download/wen_haha/10555796

 

;