天天看點

用戶端,伺服器,天氣預報

上一節中我們通過http協定,采用HttpClient向伺服器端action請求資料。當然調用伺服器端方法擷取資料并不止這一種。WebService也可以為我們提供所需資料,

那麼什麼是webService呢?,它是一種基于SAOP協定的遠端調用标準,通過webservice可以将不同作業系統平台,不同語言,不同技術整合到一起。

  我們在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方法:

第一:執行個體化SoapObject 對象,指定webService的命名空間(從相關WSDL文檔中可以檢視命名空間),以及調用方法名稱。如:

用戶端,伺服器,天氣預報

View Code

用戶端,伺服器,天氣預報

//命名空間

privatestaticfinal String serviceNameSpace="http://WebXml.com.cn/";

//調用方法(獲得支援的城市)

privatestaticfinal String getSupportCity="getSupportCity";

//執行個體化SoapObject對象

SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);

用戶端,伺服器,天氣預報

第二步:假設方法有參數的話,設定調用方法參數

request.addProperty("參數名稱","參數值");

第三步:設定SOAP請求資訊(參數部分為SOAP協定版本号,與你要調用的webService中版本号一緻):

用戶端,伺服器,天氣預報

//獲得序列化的Envelope

SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.bodyOut=request;

第四步:注冊Envelope,

(new MarshalBase64()).register(envelope);

第五步:建構傳輸對象,并指明WSDL文檔URL:

用戶端,伺服器,天氣預報

//請求URL

privatestaticfinal String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";

//Android傳輸對象

AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);

transport.debug=true;

第六步:調用WebService(其中參數為1:命名空間+方法名稱,2:Envelope對象):

用戶端,伺服器,天氣預報

第七步:解析傳回資料:

用戶端,伺服器,天氣預報

這樣就成功啦。那麼現在我們就來測試下吧,這裡有個位址提供webService天氣預報的服務的,我這裡隻提供擷取城市清單:

用戶端,伺服器,天氣預報

 然後你可以在浏覽器中輸入位址(WSDL):serviceURL,你會看到一些可供調用的方法:

用戶端,伺服器,天氣預報

 我們選擇擷取國内外主要城市或者省份的方法吧:getSupportProvice,然後調用,你會發現浏覽器傳回給我們的是xml文檔:

用戶端,伺服器,天氣預報

我們可以用 listview來顯示:

那麼下面我将給出全部代碼:

用戶端,伺服器,天氣預報

以及幫助類:

用戶端,伺服器,天氣預報
用戶端,伺服器,天氣預報

publicclass WebServiceUtil {

//調用城市的方法(需要帶參數)

privatestaticfinal String getWeatherbyCityName="getWeatherbyCityName";

//調用省或者直轄市的方法(獲得支援的省份或直轄市)

privatestaticfinal String getSupportProvince="getSupportProvince";

/*************

* @return城市清單

*************/

publicstatic List<String> getCityList(){

//調用

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) {

returnnull;

publicstatic List<String> getProviceList(){

SoapObject request=new SoapObject(serviceNameSpace, getSupportProvince);

* @param cityName

* @return

publicstatic String getWeather(String cityName){

return"";

/**************

* 解析XML

* @param str

*/

privatestatic 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;

/*********

* 擷取天氣

* @param soapObject

privatevoid parseWeather(SoapObject soapObject){

//String date=soapObject.getProperty(6);

用戶端,伺服器,天氣預報

以上就是我所作的查詢天氣預報的全部核心代碼了,讀者可以根據注釋以及本文章了解下具體實作,相信很快就搞明白了,運作結果如下:

用戶端,伺服器,天氣預報
用戶端,伺服器,天氣預報
用戶端,伺服器,天氣預報
用戶端,伺服器,天氣預報
用戶端,伺服器,天氣預報

 到此結束,下一節主要是socket通信了。

繼續閱讀