作者:东子哥来源:博客园发布时间:2011-04-2421:43阅读:2358次上一节中我们通过http协议,采用HttpClient向服务器端action请求数据。当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过JAVAME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包了,那么我们就开始吧:首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包然后新建android项目:并把下载的KSOAP包放在android项目的lib目录下:右键-buildpath-configurebuildpath--选择Libraries,如图:以下分为七个步骤来调用WebService方法:第一:实例化SoapObject对象,指定webService的命名空间(从相关WSDL文档中可以查看命名空间),以及调用方法名称。如://命名空间privatestaticfinalStringserviceNameSpace=调用方法(获得支持的城市)privatestaticfinalStringgetSupportCity=getSupportCity;//实例化SoapObject对象SoapObjectrequest=newSoapObject(serviceNameSpace,getSupportCity);第二步:假设方法有参数的话,设置调用方法参数:request.addProperty(参数名称,参数值);第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致)://获得序列化的EnvelopeSoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope(SoapEnvelope.VER11);envelope.bodyOut=request;第四步:注册Envelope:(newMarshalBase64()).register(envelope);第五步:构建传输对象,并指明WSDL文档URL://请求URLprivatestaticfinalStringserviceURL=传输对象AndroidHttpTransporttransport=newAndroidHttpTransport(serviceURL);transport.debug=true;第六步:调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象):transport.call(serviceNameSpace+getWeatherbyCityName,envelope);第七步:解析返回数据:if(envelope.getResponse()!=null){returnparse(envelope.bodyIn.toString());}/***************解析XML*@paramstr*@return*/privatestaticListStringparse(Stringstr){Stringtemp;ListStringlist=newArrayListString();if(str!=null&&str.length()0){intstart=str.indexOf(string);intend=str.lastIndexOf(;);temp=str.substring(start,end-3);String[]test=temp.split(;);for(inti=0;itest.length;i++){if(i==0){temp=test[i].substring(7);}else{temp=test[i].substring(8);}intindex=temp.indexOf(,);list.add(temp.substring(0,index));}}returnlist;}这样就成功啦。那么现在我们就来测试下吧,这里有个地址提供webService天气预报的服务的,我这里只提供获取城市列表://命名空间privatestaticfinalStringserviceNameSpace=请求URLprivatestaticfinalStringserviceURL=调用方法(获得支持的城市)privatestaticfinalStringgetSupportCity=getSupportCity;//调用城市的方法(需要带参数)privatestaticfinalStringgetWeatherbyCityName=getWeatherbyCityName;//调用省或者直辖市的方法(获得支持的省份或直辖市)privatestaticfinalStringgetSupportProvince=getSupportProvince;然后你可以在浏览器中输入地址(WSDL):serviceURL,你会看到一些可供调用的方法:我们选择获取国内外主要城市或者省份的方法吧:getSupportProvice,然后调用,你会发现浏览器返回给我们的是xml文档:?xmlversion=1.0encoding=utf-8?-ArrayOfStringxmlns:xsi=:xsd==直辖市/stringstring特别行政区/stringstring黑龙江/stringstring吉林/stringstring辽宁/stringstring内蒙古/stringstring河北/stringstring河南/stringstring山东/stringstring山西/stringstring江苏/stringstring安徽/stringstring陕西/stringstring宁夏/stringstring甘肃/stringstring青海/stringstring湖北/stringstring湖南/stringstring浙江/stringstring江西/stringstring福建/stringstring贵州/stringstring四川/stringstring广东/stringstring广西/stringstring云南/stringstring海南/stringstring新疆/stringstring西藏/stringstring台湾/stringstring亚洲/stringstring欧洲/stringstring非洲/stringstring北美洲/stringstring南美洲/stringstring大洋洲/string/ArrayOfString我们可以用listview来显示:那么下面我将给出全部代码:publicclassWebServiceHelper{//WSDL文档中的命名空间privatestaticfinalStringtargetNameSpace=文档中的URLprivatestaticfinalStringWSDL=需要调用的方法名(获得本天气预报WebServices支持的洲、国内外省份和城市信息)privatestaticfinalStringgetSupportProvince=getSupportProvince;//需要调用的方法名(获得本天气预报WebServices支持的城市信息,根据省份查询城市集合:带参数)privatestaticfinalStringgetSupportCity=getSupportCity;//根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数privatestaticfinalStringgetWeatherbyCityName=getWeatherbyCityName;/*********获得州,国内外省份和城市信息*@return*/publicListStringgetProvince(){ListStringprovinces=newArrayListString();Stringstr=;SoapObjectsoapObject=newSoapObject(targetNameSpace,getSupportProvince);//request.addProperty(参数,参数值);调用的方法参数与参数值(根据具体需要可选可不选)SoapSerializationEnvelopeenvelope=newSoapSerializationEnvelope(SoapEnvelope.VER11);envelope.dotNet=true;envelope.setOutputSoapObject(soapObject);//envelope.bodyOut=request;AndroidHttpTransporthttpTranstation=newAndroidHttpTransport(WSDL);//或者HttpTransportSEhttpTranstation=newHttpTransportSE(WSDL);try{httpTranstation.call(targetNameSpace+getSupportProvince,envelope);SoapObjectresult=(SoapObject)envelope.getResponse();//下面对结果进行解析,结构类似json对象//str=(String)result.getProperty(6).toString();intcount=result.getPropertyCount();for(intindex=0;indexcount;index++){provinces.add(result.getProperty(index).toString());}}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(XmlPullParserExceptione){