一、获取并使用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>