經常有網友問:“在Android平台如何調用WebService”?經過溝通我發現,甚至有些朋友連什麼是WebSerivce都不知道就在問怎麼使用,更別說和WebService有關的SOAP、WSDL這類“火星”名詞了。所以,我就想在講解Android平台如何調用WebSerivce之前,先來介紹下WebService,看看它到底有多神秘。
記得我的碩士論文題目中就包含“Web Service”這個詞,當時還是花了大量時間去研究Web Service在系統整合、公司專屬應用程式整合方面的應用;在工作中,接觸的幾個項目全都用到了Web Service;現在在工作之餘抽點時間學習Android,又是Web Service。看來Web Service真是無處不在,有程式設計語言的地方,總能找到它的身影(提示:如果你以前沒接觸過WebService,這裡需要知道WebService並不是Android的專利,10幾年前就已經出現了)。
根據W3C的定義,Web Services(Web服務)是一個用於支援網路間不同機器互操作的軟體系統,它是一種自包含、自描述和模組化的應用程式,它可以在網路中被描述、發布和調用,可以將它看作是基於網路的、分布式的模組化組件。
Web Services是建立在通用協議的基礎之上,如HTTP、SOAP、UDDI、WSDL等,這些協議在作業系統、程式設計語言和物件模型的選擇上沒有任何傾向,因此有著很強的生命力。
Web Services的優勢在於提供了不同應用程式平台之間的互操作,它使得基於組件的開發和Web相結合的效果達到最佳。它是基於HTTP協議的,調用請求和回應訊息都可以穿過防火牆,不需要更改防火牆的設定,這樣就避免了使用特殊連接埠進行通訊時無法穿越防火牆的問題。
簡單的理解:通常我們所說的WebService都是遠端某個伺服器對外公開了某種服務,或者理解為對外公開了某個功能或者方法,而我們可以通過編程來調用該服務以獲得我們需要的資訊。例如:www.webxml.com.cn對外公開了手機號碼歸屬地查詢服務,我們只需要在調用該服務時傳入一個手機號段(號碼),就能立即擷取該號段的歸屬地資訊。
更通俗的理解:通過使用WebService,我們能夠像調用本地方法一樣去調用遠程伺服器上的方法。我們並不需要關心遠端那個方法是Java寫的,還是PHP或C#寫的;我們並不需要關心遠端方法是基於Unix平台,還是Windows平台,也就是說WebService與平台和語言無關。
說到WebSerivce,就必須要知道SOAP和WSDL,它們到底和WebSerice有著怎麼的關係?上面已經提到,Web Services是建立在HTTP、SOAP、WSDL等通用協議的基礎之上。
SOAP(Simple Object Access Protocol,簡易物件存取通訊協定 (SOAP))是一種輕量級的、簡單的、基於XML的協議,被設計用於在分布式環境中交換格式化和固化資訊的簡單協議。也就是說,要進行通訊,進行資料訪問傳輸,就必須依賴於一定的協議,而SOAP正是WebService通訊中所依賴的一種協議。目前經常使用的SOAP協議有兩個版本:SOAP 1.1 和 SOAP 1.2。
WSDL(Web Services Description Language,即Web服務描述語言)是一種用來描述Web服務的XML語言,它描述了Web服務的功能、介面、參數、傳回值等,便於使用者綁定和調用服務。它以一種和具體語言無關的方式定義了給定Web服務調用和應答的相關操作和訊息。
WSDL是我們能夠實實在在看到的東西,它是一份xml文檔,用於描述某個WebSerivce的方方面面。例如,上面曾提到www.webxml.com.cn網站提供了手機號碼歸屬地查詢的WebSerivce,我們怎麼來使用這個WebSerivce呢?它是基於哪個版本的SOAP協議?調用它需要傳入什麼參數?它會返回什麼值?是一個字串還是xml文檔?這一系列的問題都能在WSDL中找到答案。上面這個服務的WSDL地址是:http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl,在瀏覽器上訪問它,你將會看到如下所示的xml文檔:
以下是C#中開發android:
:
(註:介面簡陋湊著看,部分手機號抹去)
詳細實現:如下
1. 建立Android項目,不細說了
2. 添加web引用
3. 開啟資源檔Resources——Layout——Main.axml
添加控制項
代碼如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:minWidth="25px" android:minHeight="25px"> <EditText android:id="@+id/txttel" android:layout_width="166.0dp" android:layout_height="40.0dp" android:phoneNumber="true" android:gravity="top" android:hint="請輸入手機號" /> <Button android:text="查詢" android:layout_width="162.7dp" android:layout_height="wrap_content" android:id="@+id/btncx" android:layout_marginRight="0.0dp" /> <TextView android:text="" android:layout_width="284.7dp" android:layout_height="83.3dp" android:id="@+id/txtjg" /></LinearLayout>
4. 開啟Activity1.cs
using System;using Android.App;using Android.Content;using Android.Runtime;using Android.Views;using Android.Widget;using Android.OS;namespace Atel{ [Activity(Label = "Atel", MainLauncher = true, Icon = "@drawable/icon")] public class Activity1 : Activity { int count = 1; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); // Get our button from the layout resource, // and attach an event to it Button button = FindViewById<Button>(Resource.Id.btncx); EditText txttel = FindViewById<EditText>(Resource.Id.txttel); TextView tjg = FindViewById<TextView>(Resource.Id.txtjg); button.Click += delegate { //button.Text = string.Format("{0} clicks!", count++); try { cn.com.webxml.webservice.MobileCodeWS motel = new cn.com.webxml.webservice.MobileCodeWS(); string strs = motel.getMobileCodeInfo(txttel.Text.ToString(), ""); tjg.Text = strs; } catch (Exception ex) { } }; } }}
運行模擬器,看看效果吧
--資料--------------------
其他 火車查詢的介面 http://my.oschina.net/simaben/blog/109806