Android與服務器端數(shù)據(jù)交互(基于SOAP協(xié)議整合android+webservice)-_第1頁
Android與服務器端數(shù)據(jù)交互(基于SOAP協(xié)議整合android+webservice)-_第2頁
Android與服務器端數(shù)據(jù)交互(基于SOAP協(xié)議整合android+webservice)-_第3頁
Android與服務器端數(shù)據(jù)交互(基于SOAP協(xié)議整合android+webservice)-_第4頁
Android與服務器端數(shù)據(jù)交互(基于SOAP協(xié)議整合android+webservice)-_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 HYPERLINK /zhangdongzi/archive/2011/04/19/2020688.html Android與服務器端數(shù)據(jù)交互(基于SOAP協(xié)議整合android+webservice)上一節(jié)中我們通過http協(xié)議,采用HttpClient向服務器端action請求數(shù)據(jù)。當然調用服務器端方法獲取數(shù)據(jù)并不止這一種。WebService也可以為我們提供所需數(shù)據(jù),那么什么是webService呢?,它是一種基于SAOP協(xié)議的遠程調用標準,通過webservice可以將不同操作系統(tǒng)平臺,不同語言,不同技術整合到一起。 我們在PC機器java客戶端中,需要一些庫,比如XFire,Axi

2、s2,CXF等等來支持訪問WebService,但是這些庫并不適合我們資源有限的android手機客戶端,做過JAVA ME的人都知道有KSOAP這個第三方的類庫,可以幫助我們獲取服務器端webService調用,當然KSOAP已經(jīng)提供了基于android版本的jar包了,那么我們就開始吧:首先下載KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包然后新建android項目:并把下載的KSOAP包放在android項目的lib目錄下:右鍵-build path-configure build path-選擇Librar

3、ies,如圖:以下分為七個步驟來調用WebService方法:第一:實例化SoapObject 對象,指定webService的命名空間(從相關WSDL文檔中可以查看命名空間),以及調用方法名稱。如:View Code /命名空間privatestaticfinal String serviceNameSpace=http:/WebX/;/調用方法(獲得支持的城市)privatestaticfinal String getSupportCity=getSupportCity;/實例化SoapObject對象 SoapObject request=new SoapObject(serviceNa

4、meSpace, getSupportCity);第二步:假設方法有參數(shù)的話,設置調用方法參數(shù)request.addProperty(參數(shù)名稱,參數(shù)值);第三步:設置SOAP請求信息(參數(shù)部分為SOAP協(xié)議版本號,與你要調用的webService中版本號一致):View Code /獲得序列化的Envelope SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut=request;第四步:注冊Envelope,(new MarshalBase6

5、4().register(envelope);第五步:構建傳輸對象,并指明WSDL文檔URL:View Code /請求URLprivatestaticfinal String serviceURL=/webservices/weatherwebservice.asmx;/Android傳輸對象 AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL); transport.debug=true;第六步:調用WebService(其中參數(shù)為1:命名空間+方法名稱,2:Envelope對象):View Code tra

6、nsport.call(serviceNameSpace+getWeatherbyCityName, envelope);第七步:解析返回數(shù)據(jù):View Code if(envelope.getResponse()!=null)return parse(envelope.bodyIn.toString(); /* * 解析XML * param str * return */privatestatic List parse(String str) String temp; List list=new ArrayList();if(str!=null & str.length()0)int st

7、art=str.indexOf(string);int end=str.lastIndexOf(;); temp=str.substring(start, end-3); String test=temp.split(;);for(int i=0;itest.length;i+)if(i=0) temp=testi.substring(7); else temp=testi.substring(8); int index=temp.indexOf(,); list.add(temp.substring(0, index); return list; 這樣就成功啦。那么現(xiàn)在我們就來測試下吧,這里

8、有個地址提供webService天氣預報的服務的,我這里只提供獲取城市列表:View Code /命名空間 private static final String serviceNameSpace=http:/WebX/; /請求URL private static final String serviceURL=/webservices/weatherwebservice.asmx; /調用方法(獲得支持的城市) private static final String getSupportCity=getSupportCity; /調用城市的方法(需要帶參數(shù)) private static

9、final String getWeatherbyCityName=getWeatherbyCityName; /調用省或者直轄市的方法(獲得支持的省份或直轄市) private static final String getSupportProvince=getSupportProvince;然后你可以在瀏覽器中輸入地址(WSDL):serviceURL,你會看到一些可供調用的方法:我們選擇獲取國內外主要城市或者省份的方法吧:getSupportProvice,然后調用,你會發(fā)現(xiàn)瀏覽器返回給我們的是xml文檔:View Code - 直轄市特別行政區(qū)黑龍江吉林遼寧內蒙古河北河南山東山西江蘇安

10、徽陜西寧夏甘肅青海湖北湖南浙江江西福建貴州四川廣東廣西云南海南新疆西藏臺灣亞洲歐洲非洲北美洲南美洲大洋洲我們可以用 listview來顯示:那么下面我將給出全部代碼:View Code publicclass WebServiceHelper /WSDL文檔中的命名空間privatestaticfinal String targetNameSpace=http:/WebX/;/WSDL文檔中的URLprivatestaticfinal String WSDL=/WebServices/WeatherWebService.asmx?wsdl;/需要調用的方法名(獲得本天氣預報Web Servic

11、es支持的洲、國內外省份和城市信息)privatestaticfinal String getSupportProvince=getSupportProvince;/需要調用的方法名(獲得本天氣預報Web Services支持的城市信息,根據(jù)省份查詢城市集合:帶參數(shù))privatestaticfinal String getSupportCity=getSupportCity;/根據(jù)城市或地區(qū)名稱查詢獲得未來三天內天氣情況、現(xiàn)在的天氣實況、天氣和生活指數(shù)privatestaticfinal String getWeatherbyCityName=getWeatherbyCityName;/*

12、* 獲得州,國內外省份和城市信息 * return */public List getProvince() List provinces=new ArrayList(); String str=; SoapObject soapObject=new SoapObject(targetNameSpace,getSupportProvince);/request.addProperty(參數(shù), 參數(shù)值);調用的方法參數(shù)與參數(shù)值(根據(jù)具體需要可選可不選) SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnve

13、lope.VER11); envelope.dotNet=true; envelope.setOutputSoapObject(soapObject);/envelope.bodyOut=request; AndroidHttpTransport httpTranstation=new AndroidHttpTransport(WSDL);/或者HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);try httpTranstation.call(targetNameSpace+getSupportProvince, envelop

14、e); SoapObject result=(SoapObject)envelope.getResponse();/下面對結果進行解析,結構類似json對象 /str=(String) result.getProperty(6).toString();int count=result.getPropertyCount();for(int index=0;indexcount;index+) provinces.add(result.getProperty(index).toString(); catch (IOException e) / TODO Auto-generated catch b

15、lock e.printStackTrace(); catch (XmlPullParserException e) / TODO Auto-generated catch block e.printStackTrace(); return provinces; /* * 根據(jù)省份或者直轄市獲取天氣預報所支持的城市集合 * param province * return */public List getCitys(String province) List citys=new ArrayList(); SoapObject soapObject=new SoapObject(targetNa

16、meSpace,getSupportCity); soapObject.addProperty(byProvinceName, province); SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet=true; envelope.setOutputSoapObject(soapObject); AndroidHttpTransport httpTransport=new AndroidHttpTransport(WSDL);try httpT

17、ransport.call(targetNameSpace+getSupportCity, envelope); SoapObject result=(SoapObject)envelope.getResponse();int count=result.getPropertyCount();for(int index=0;indexcount;index+) citys.add(result.getProperty(index).toString(); catch (IOException e) / TODO Auto-generated catch block e.printStackTra

18、ce(); catch (XmlPullParserException e) / TODO Auto-generated catch block e.printStackTrace(); return citys; /* * 根據(jù)城市信息獲取天氣預報信息 * param city * return */public WeatherBean getWeatherByCity(String city) WeatherBean bean=new WeatherBean(); SoapObject soapObject=new SoapObject(targetNameSpace,getWeather

19、byCityName); soapObject.addProperty(theCityName,city);/調用的方法參數(shù)與參數(shù)值(根據(jù)具體需要可選可不選) SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet=true; envelope.setOutputSoapObject(soapObject);/envelope.bodyOut=request; AndroidHttpTransport httpTranstation=new And

20、roidHttpTransport(WSDL);/或者HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);try httpTranstation.call(targetNameSpace+getWeatherbyCityName, envelope); SoapObject result=(SoapObject)envelope.getResponse();/下面對結果進行解析,結構類似json對象 bean=parserWeather(result); catch (IOException e) / TODO Auto-gene

21、rated catch block e.printStackTrace(); catch (XmlPullParserException e) / TODO Auto-generated catch block e.printStackTrace(); return bean; /* * 解析返回的結果 * param soapObject */protected WeatherBean parserWeather(SoapObject soapObject) WeatherBean bean=new WeatherBean(); ListMap list=new ArrayListMap()

22、; Map map=new HashMap();/城市名 bean.setCityName(soapObject.getProperty(1).toString();/城市簡介 bean.setCityDescription(soapObject.getProperty(soapObject.getPropertyCount()-1).toString();/天氣實況+建議 bean.setLiveWeather(soapObject.getProperty(10).toString()+n+soapObject.getProperty(11).toString();/其他數(shù)據(jù) /日期, St

23、ring date=soapObject.getProperty(6).toString();/- String weatherToday=今天: + date.split( )0; weatherToday+=n天氣:+ date.split( )1; weatherToday+=n氣溫:+soapObject.getProperty(5).toString(); weatherToday+=n風力:+soapObject.getProperty(7).toString(); weatherToday+=n; List icons=new ArrayList(); icons.add(par

24、seIcon(soapObject.getProperty(8).toString(); icons.add(parseIcon(soapObject.getProperty(9).toString(); map.put(weatherDay, weatherToday); map.put(icons,icons); list.add(map);/- map=new HashMap(); date=soapObject.getProperty(13).toString(); String weatherTomorrow=明天: + date.split( )0; weatherTomorrow

25、+=n天氣:+ date.split( )1; weatherTomorrow+=n氣溫:+soapObject.getProperty(12).toString(); weatherTomorrow+=n風力:+soapObject.getProperty(14).toString(); weatherTomorrow+=n; icons=new ArrayList(); icons.add(parseIcon(soapObject.getProperty(15).toString(); icons.add(parseIcon(soapObject.getProperty(16).toStr

26、ing(); map.put(weatherDay, weatherTomorrow); map.put(icons,icons); list.add(map);/- map=new HashMap(); date=soapObject.getProperty(18).toString(); String weatherAfterTomorrow=后天: + date.split( )0; weatherAfterTomorrow+=n天氣:+ date.split( )1; weatherAfterTomorrow+=n氣溫:+soapObject.getProperty(17).toStr

27、ing(); weatherAfterTomorrow+=n風力:+soapObject.getProperty(19).toString(); weatherAfterTomorrow+=n; icons=new ArrayList(); icons.add(parseIcon(soapObject.getProperty(20).toString(); icons.add(parseIcon(soapObject.getProperty(21).toString(); map.put(weatherDay, weatherAfterTomorrow); map.put(icons,icon

28、s); list.add(map); /- bean.setList(list);return bean; /解析圖標字符串privateint parseIcon(String data)/ 0.gif,返回名稱0,int resID=32; String result=data.substring(0, data.length()-4).trim();/ String icon=data.split(.); / String result=icon0.trim(); / Log.e(this is the icon, result.trim();if(!result.equals(noth

29、ing) resID=Integer.parseInt(result.trim(); return resID;/return (a_+data).split(.)0; 以及幫助類:View Code publicclass WebServiceUtil /命名空間privatestaticfinal String serviceNameSpace=http:/WebX/;/請求URLprivatestaticfinal String serviceURL=/webservices/weatherwebservice.asmx;/調用方法(獲得支持的城市)privatestaticfinal

30、String getSupportCity=getSupportCity;/調用城市的方法(需要帶參數(shù))privatestaticfinal String getWeatherbyCityName=getWeatherbyCityName;/調用省或者直轄市的方法(獲得支持的省份或直轄市)privatestaticfinal String getSupportProvince=getSupportProvince;/* * return城市列表 */publicstatic List getCityList()/實例化SoapObject對象 SoapObject request=new So

31、apObject(serviceNameSpace, getSupportCity);/獲得序列化的Envelope SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut=request; (new MarshalBase64().register(envelope);/Android傳輸對象 AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL); transpo

32、rt.debug=true;/調用try transport.call(serviceNameSpace+getWeatherbyCityName, envelope);if(envelope.getResponse()!=null)return parse(envelope.bodyIn.toString(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); catch (XmlPullParserException e) / TODO Auto-generated catch bloc

33、k e.printStackTrace(); returnnull; publicstatic List getProviceList()/實例化SoapObject對象 SoapObject request=new SoapObject(serviceNameSpace, getSupportProvince);/獲得序列化的Envelope SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut=request; (new MarshalBase64().registe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論