Android使用webservice与服务器通讯

概述:我们在Android移动设备上面,与服务器通讯有很多种方式,其中webservice便是其中一种较方便且易用的方式。服务端只要把webservice接口暴露出来,再配上wsdl文档,客户端就可以很方便的调用了。
WSDL:刚刚讲到wsdl文档,这个其实是服务端再写好webservice接口后,生成的一个在线文档。通过服务端给出的网页地址,你就可以去访问到这个网页文档。它准确地描述了客户端可以调用哪些方法,这些方法的定义,方法需要的参数等非常重要的信息。如下是我们项目的一个wsdl在线文档:
这里写图片描述
点进去其中一个方法:
红色圈出的就是该方法需要的参数
Soap:Android调用webservice当然离不开soap框架了。soap其实也是一种协议,它用xml的形式定义了数据该怎样组织和解析。soap框架把底层的一些细节过滤掉,让我们可以很容易在Android端就使用webservice。我们Android端通常使用的ksoap2-android这个第三方的框架,下载地址:http://download.csdn.net/detail/yus201120/9881698
使用:下载好jar包之后导入到项目中,添加应用便可以使用了,下面直接看代码说话:

/**
     * 检查登录信息
     * @param param
     */
     public void checkInfo(String mac,String username,String pwd) {  
            // 命名空间  (相当于是soapAction去掉方法名)
            String nameSpace = "http://nfswit.cc/"; 

            // 调用的方法名称  
            String methodName = "DeviceLogin";  

            // EndPoint  (其实就是wsdl文档的网址)
            String endPoint = "http://182.247.238.98:82/WebService1.asmx";  

            // SOAP Action  
            String soapAction = "http://nfswit.cc/DeviceLogin";

            // 指定WebService的命名空间和调用的方法名  
            SoapObject rpc = new SoapObject(nameSpace, methodName);  

            //指定参数
            rpc.addProperty("strMAC", mac);   
            rpc.addProperty("strWorkerNo", username);
            rpc.addProperty("strPwd", pwd);
            rpc.addProperty("strLoginPosition", "123_587");
            rpc.addProperty("strIsManager", "N");

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

            HttpTransportSE transport = new HttpTransportSE(endPoint);  
            try {  
                // 调用WebService  
                transport.call(soapAction, envelope);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  

            // 获取返回的数据  
            Object object = envelope.bodyIn;   
//          SoapFault object = (SoapFault) envelope.bodyIn;  

            if(object==null){
                Log.i(TAG, "return object is null!");
                return;
            }
            if(object instanceof SoapFault){
                Log.i(TAG, "SoapFault refult is :"+  object.toString());
                callback.loginFailed("服务器无法处理请求!");
                return;
            }else if(object instanceof SoapObject){
                  // 获取返回的结果  
                Log.i(TAG, "SoapObject refult is :"+  object.toString());

                try{
                    SoapObject result = (SoapObject)object;
                    PropertyInfo info = new PropertyInfo();
                    result.getPropertyInfo(0, info);
                    String str = result.getProperty(0).toString();
                    Log.i(TAG, str);
                    JSONObject jsonobj =(JSONObject)JSONValue.parse(str);
                    String code = (String)jsonobj.get("code");

                    if(code.equals("0")){
                        //success
                        callback.loginSuccess((String)jsonobj.get("data"));
                    }else{
                        //failed
                        callback.loginFailed((String)jsonobj.get("data"));
                        callback.loginFailed(code);
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }

            }

        }

代码里面的注释已经写得很明白了。下面是几个注意点:
1、操作网络的功能调用,需要放到子线程中执行才行,不然就会报错。
2、目前我在使用ksoap的时候,发现带的参数最好是 字符串类型,不然很容易报错

猜你喜欢

转载自blog.csdn.net/yus201120/article/details/73778617