Android 手札:使用Ksoap2框架调用WebService速成

一、前提

1、在PC端创建WebService服务,别忘了记下WebService服务的URL地址,相关步骤可参照百度的相关教程。

2、可将WebsService服务发布至外网或内网,若条件有限,只求实现功能,最简单的办法:

(1)在PC端通过”猎豹免费WiFi“等软件开启网络热点,由移动设备连接。

(2)在移动端开启热点,由PC端连接。

(3)使用AVD模拟器无需考虑,默认的AVD模拟器与PC端ip地址一致。

   即只要保持移动设备与PC设备ip一致即可。

3、在Android工程文件的Libs目录引入Ksoap2框架的jar包,如:

       

4.在Android工程文件的AndroidManifest.xml中加入网络权限:

<uses-permission android:name="android.permission.INTERNET"/>
扫描二维码关注公众号,回复: 2393381 查看本文章

二、编写Android代码

(1)Handler代码:

Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what){
                case 0:
                    Toast.makeText(GeneralAccessibilityRecommend.this, "连接服务器失败", Toast.LENGTH_LONG).show();
                default:
                    break;
            }
        }
    };

(2)获取数据代码:

private void GetData() {
        final  String SERVICE_NS = "http://tempuri.org/";//命名空间
        final  String SOAP_ACTION = "http://tempuri.org/getHosInfo";//用来定义消息请求的地址,也就是消息发送到哪个操作
        final  String SERVICE_URL = "http://192.168.xx.xxx/mulu/WebService.asmx";//URL地址,这里写发布的网站的本地地址
        String methodName = "getInfo"//调用的WebService的方法名;
        //创建HttpTransportSE传输对象,该对象用于调用Web Service操作
        final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
        ht.debug = true;
        //使用SOAP1.1协议创建Envelop对象。从名称上来看,SoapSerializationEnvelope代表一个SOAP消息封包;但ksoap2-android项目对
        //SoapSerializationEnvelope的处理比较特殊,它是HttpTransportSE调用Web Service时信息的载体--客户端需要传入的参数,需要通过
        //SoapSerializationEnvelope对象的bodyOut属性传给服务器;服务器响应生成的SOAP消息也通过该对象的bodyIn属性来获取。
        final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        //实例化SoapObject对象,创建该对象时需要传入所要调用的Web Service的命名空间、Web Service方法名
        SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
        soapObject.addProperty("Info",department);
        //对dotnet webservice协议的支持,如果dotnet的webservice
        envelope.dotNet = true;
        //调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前两步创建的SoapObject对象设为
        //SoapSerializationEnvelope的付出SOAP消息体
        envelope.bodyOut = soapObject;
        new Thread(){
            @Override
            public void run() {
                try {
                    //调用WebService,调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程Web Service
                    ht.call(SOAP_ACTION, envelope);
                    if(envelope.getResponse() != null) {
                        //获取服务器响应返回的SOAP消息,调用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个
                        //SoapObject对象,该对象就代表了Web Service的返回消息。解析该SoapObject对象,即可获取调用Web Service的返回值
                        SoapObject so = (SoapObject) envelope.bodyIn;
                        // 获取子节点
                        SoapObject soapChilds = (SoapObject) so.getProperty(0);

                        ArrayList<Map<String, String>> data = new ArrayList<Map<String, String>>();
                        if (soapChilds != null) {
                            int size = soapChilds.getPropertyCount();
                            if (size > 0) {
                                Map<String, String> map=null;
                                //若获取的数据为多列数据,可采用以下方式进行处理
                                for (int i = 0; i < soapChilds.getPropertyCount(); i++) {
                                    int tag = i % 3;
                                    switch (tag) {
                                        case 0: {
                                            list1.add(soapChilds.getProperty(i).toString());
                                        }
                                        break;
                                        case 1: {
                                            list2.add(Double.parseDouble(soapChilds.getProperty(i).toString()));
                                        }
                                        break;
                                        case 2: {
                                            list3.add(Double.parseDouble(soapChilds.getProperty(i).toString()));
                                        }
                                        break;
                                        default:
                                            break;
                                    }
                                }
                            }
                        }
                        Message msg = new Message();
                        msg.what = 1;
                        handler.sendMessage(msg);
                    }
                    else{
                        Message msg=new Message();
                        msg.what=0;
                        handler.sendMessage(msg);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

猜你喜欢

转载自blog.csdn.net/smart3s/article/details/81143876