微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WebService的用法

一、获取并使用KSOAP包

在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService。PC版本的WebService库非常丰富,但这些对Android来说过于庞大。适合手机的WebService客户端的SDK有一些,比较常用的是KSOAP2。

KSOAP2 地址:http://code.google.com/p/ksoap2-android/

我下载的最新的是: ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar

注意:

我在使用ksoap2-android时犯了一个低级错误:使用时报错误:The import org.ksoap2 cannot be resolved。
当时分析这个问题时一直以为是Eclipse出了问题,找了好多方法都不行,
实际是我下载的ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar文件错误的导致的,走了弯路。

http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2 页面 通过鼠标右键链接另存为存的是同名的一个纯文本的Html文件。而不是我们想要的。

我是在
http://code.google.com/p/ksoap2-android/source/browse/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/2.5.4/ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar  点 View raw file 才正确下载对应文件的。

 

 

 

1.WebService只调用方法不传参数的情况:

 

public static String ContactGetTableString(String functionName) {//传入WebService方法
   // WebService地址
      final String NAMESPACE = "http://www.yhcc.com.cn";//WebService命名空间
     // String URL ="http://"+ServerAndPort.ServerIP+":"+ServerAndPort.ServerPort+"/floodwarn/service/padDataChangeService?wsdl";
      String URL ="http://"+ServerAndPort.ServerIP+":"+ServerAndPort.ServerPort+"/floodwarncity/service/dataChangeService?wsdl"; 
   final String METHOD_NAME = functionName;//调用WebService的方法
   String SOAP_ACTION = "http://www.yhcc.com.cn/"+functionName;
   String returnString = null;
   try {
    //生成调用Webservice方法的SOAP请求信息
    /**
     * 创建SoapSerializationEnvelope对象时需要通过SoapSerializationEnvelope类的构造方法设置SOAP协议的版本号。
                                                        该版本号需要根据服务端WebService的版本号设置。
                                                        在创建SoapSerializationEnvelope对象后,不要忘了设置SOAPSoapSerializationEnvelope类的bodyOut属性
                                                        该属性的值就是在第一步创建的SoapObject对象。
     */
    SoapObject rpc = new SoapObject(NAMESPACE,METHOD_NAME);
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.bodyOut = rpc;
    envelope.dotNet = true;//注意:如果没有参数,这里设置成true,如果有参数,这里设置成false
    envelope.setoutputSoapObject(rpc);
    
    //创建HttpTransportsSE对象
    HttpTransportSE ht = new HttpTransportSE(URL,10000);

    ht.debug = true;

    //使用call方法调用WebService方法
    ht.call(SOAP_ACTION,envelope);
    
    /**
     * 获得WebService方法的返回结果

                                               有两种方法

                1、使用getResponse方法获得返回数据。

                private SoapObject detail;
               detail =(SoapObject) envelope.getResponse();
             
               2、使用 bodyIn 及 getProperty。
                 private SoapObject detail;
                 SoapObject result = (SoapObject)envelope.bodyIn;
                detail = (SoapObject) result.getProperty("getWeatherbyCityNameResult");
     */
    SoapObject result = (SoapObject)envelope.bodyIn;
    
    //从result中找到return的值,即:return="abd",result.getProperty("return").toString()="abd";
    returnString =  result.getProperty("return").toString();
    
   } catch (Exception e) {
    returnString=ErrorCode.ErrorCode;
    e.printstacktrace();
   }
   return returnString;
  }

 

 

2.有参数的情况下:

public static String ContactGetTableString(String functionName,String AreaNum) {//传入WebService方法名和参数
      final String NAMESPACE = "http://www.yhcc.com.cn";
      String URL ="http://"+ServerAndPort.ServerIP+":"+ServerAndPort.ServerPort+"/floodwarncity/service/dataChangeService?wsdl"; 
   final String METHOD_NAME = functionName;
   String SOAP_ACTION = "http://www.yhcc.com.cn/"+functionName;
   String returnString = null;
   try {
    
    SoapObject rpc = new SoapObject(NAMESPACE,METHOD_NAME);
    //addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致,只要设置参数的顺序一致即可。
    rpc.addProperty("arg0",AreaNum);
    
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.bodyOut = rpc;
    envelope.dotNet = false;//注意:如果没有参数,这里设置成true,如果有参数,这里设置成false
    envelope.setoutputSoapObject(rpc);
    
    HttpTransportSE ht = new HttpTransportSE(URL,10000);

    ht.debug = true;

    ht.call(SOAP_ACTION,envelope);
    
    SoapObject result = (SoapObject)envelope.bodyIn;
    
    returnString =  result.getProperty("return").toString();
    
   } catch (Exception e) {
    returnString=ErrorCode.ErrorCode;
    e.printstacktrace();
   }
   return returnString;
  }

 

 

3.这时候执行会出错,提示没有权限访问网络

需要修改 AndroidManifest.xml 文件,赋予相应权限

简单来说就是增加下面这行配置:<uses-permission android:name="android.permission.INTERNET"></uses-permission>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐