实现Android与服务器端数据交互,我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包了,那么我们就开始吧:
首先下载KSOAP包:
- ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
然后新建android项目:并把下载的KSOAP包放在android项目的lib目录下:右键->build path->configure build path--选择Libraries,如图:
以下分为七个步骤来调用WebService方法:
1、实例化SoapObject 对象,指定webService的命名空间(从相关WSDL文档中可以查看命名空间),以及调用方法名称。如:
- //命名空间
- private static final String serviceNameSpace="http://WebXml.com.cn/";
- //调用方法(获得支持的城市)
- private static final String getSupportCity="getSupportCity";
- //实例化SoapObject对象
- SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);
2、假设方法有参数的话,设置调用方法参数
- request.addProperty("参数名称","参数值");
3、设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致):
- //获得序列化的Envelope
- SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
- envelope.bodyOut=request;
4、注册Envelope,
- (new MarshalBase64()).register(envelope);
5、构建传输对象,并指明WSDL文档URL:
- //请求URL
- private static final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
- //Android传输对象
- AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);
- transport.debug=true;
6、调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象):
- transport.call(serviceNameSpace+getWeatherbyCityName, envelope);
7、解析返回数据:
- if(envelope.getResponse()!=null){
- return parse(envelope.bodyIn.toString());
- }
- /**************
- * 解析XML
- * @param str
- * @return
- */
- private static List<String> parse(String str){
- String temp;
- List<String> list=new ArrayList<String>();
- if(str!=null && str.length()>0){
- int start=str.indexOf("string");
- int end=str.lastIndexOf(";");
- temp=str.substring(start, end-3);
- String []test=temp.split(";");
- for(int i=0;i<test.length;i++){
- if(i==0){
- temp=test[i].substring(7);
- }else{
- temp=test[i].substring(8);
- }
- int index=temp.indexOf(",");
- list.add(temp.substring(0, index));
- }
- }
- return list;
- }
这样就成功啦。那么现在我们就来测试下吧,这里有个地址提供webService天气预报的服务的,我这里只提供获取城市列表:
- //命名空间
- private static final String serviceNameSpace="http://WebXml.com.cn/";
- //请求URL
- private static final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
- //调用方法(获得支持的城市)
- private static final String getSupportCity="getSupportCity";
- //调用城市的方法(需要带参数)
- private static final String getWeatherbyCityName="getWeatherbyCityName";
- //调用省或者直辖市的方法(获得支持的省份或直辖市)
- private static final String getSupportProvince="getSupportProvince";
我们选择获取国内外主要城市或者省份的方法吧:getSupportProvice,然后调用,你会发现浏览器返回给我们的是xml文档:
- <?xml version="1.0" encoding="utf-8" ?>
- <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns="http://WebXml.com.cn/">
- <string>直辖市</string>
- <string>特别行政区</string>
- <string>黑龙江</string>
- <string>吉林</string>
- <string>辽宁</string>
- <string>内蒙古</string>
- <string>河北</string>
- <string>河南</string>
- <string>山东</string>
- <string>山西</string>
- <string>江苏</string>
- <string>安徽</string>
- <string>陕西</string>
- <string>宁夏</string>
- <string>甘肃</string>
- <string>青海</string>
- <string>湖北</string>
- <string>湖南</string>
- <string>浙江</string>
- <string>江西</string>
- <string>福建</string>
- <string>贵州</string>
- <string>四川</string>
- <string>广东</string>
- <string>广西</string>
- <string>云南</string>
- <string>海南</string>
- <string>新疆</string>
- <string>西藏</string>
- <string>台湾</string>
- <string>亚洲</string>
- <string>欧洲</