Android 項目開發 基於Web Service 服務的中英翻譯軟件(三) Web Service服務 – Android移動開發技術文章_手機開發 Android移動開發教學課程

關於Web Service

  Android 應用通常是運行手機平臺上,手機系統的硬件資源遠遠比不上PC平臺,不管是存儲能力還是計算能力,在Android平臺上運行一些小的應用時可能的,但對於需要進行大量數據處理,復雜的計算麼還是隻能部署在遠程服務器上,而Android應用隻能充當這些應用的客戶端,而這款中英翻譯軟件,其實就是部署在服務器上中英翻譯服務的客戶訪問窗口。用戶可以通過客戶端來訪問服務端,而復雜的數據處理與大量的數據存儲都是在服務器上,客戶端隻是負責將服務器準備好的數據呈現給用戶而已,所以它本身並不承擔著大量的數據運算,為瞭能實現遠程訪問服務的功能,Web Service是一種不錯的選擇。

  舉個例子,比如我公司做瞭一個翻譯服務,我想讓其他公司都能使用到我的這個服務,讓其他公司開發自己特有的翻譯軟件,那麼我可以通過CXF開發出一個Web Servie放到本公司服務器上,並且公佈其對應的WSDL文檔供外界使用。

  什麼是WSDL文檔?

  這個很重要,他是描述Web Service的語言,比如你要別人用你的Web產品,你不告訴人傢怎麼用是不行的,你需要提供一份說明書,而WSDL就是Web Service服務的說明書,我要用的是中英翻譯Web Service,那麼它提供的WSDL也是針對與此服務的說明,可以把等同為API文檔。

  由於我們開發的重點是如何調用Web Service,因此不用在意如何使用CXF開發Web Service,以及Web Service文檔中各個元素的作用、意義等,那是屬於Web Service服務端開發的技術瞭。

  但是說明書WSDL,還是要會讀的,如果不會讀也沒關系,一般的Web Service服務都會有說明文檔,一邊看文檔,一邊看WSDL,自己就可以摸索出些規律,瞭解那些元素的作用。

  開發

  首先給大傢分享一個網站(好東西是要拿出來D),這個網站包括和很多免費的Web服務,比如傳說中的天氣預報、手機號歸屬地、IP地址歸屬地、列車時刻表、郵箱驗證、驗證碼圖片生成、還有什麼股票啦,基金啦,是不是聽著就很過癮?連接如下(我不是打廣告的,現在很多Andoird教科書上都是用的此網址):

  aspx”>http://www.webxml.com.cn/zh_cn/index.aspx

  是不是有瞭WSDL,就具備在Android平臺上調用Web Service的條件瞭?

  還不夠!我們還需要一個jar包,ksaop2-android。

  Goolge為Android平臺開發Web Service客戶端提供瞭ksoap2-android項目,但是它未直接集成在Android平臺,需要自己下載。

  稍後我試試能不能上傳一個,供大傢學習用,呵呵。

  下載好ksoap2-android後,接下來就可以借助與ksoap-android來調用Web Service所暴露的操作,就可以開發項目瞭,當然首先要將此包導入到項目中。

  首先上一段代碼:先別看代碼,看我後面的實現步驟,然後再對照著代碼看。

  

 

	 1 package wuchen.utils;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.ksoap2.SoapEnvelope;
 7 import org.ksoap2.serialization.SoapObject;
 8 import org.ksoap2.serialization.SoapSerializationEnvelope;
 9 import org.ksoap2.transport.HttpTransportSE;
10 
11 public class Ksoap2 {
12     
13     private static final String SERVICE_URL = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
14     private static final String SERVICE_NS = "http://WebXml.com.cn/";
15     private static final String WORD_KEY = "wordKey";
16     private List<String> messageList;
17     
18     public List<String> getMessgesList(String methodName,String words) throws Exception {
19         return getSoapObject(methodName,words);
20     }
21         
22     private List<String> getSoapObject(String methodName,String words) throws Exception{
23         HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
24         ht.debug = true;
25         SoapSerializationEnvelope envelope = 
26                 new SoapSerializationEnvelope(SoapEnvelope.VER11);
27         SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
28         soapObject.addProperty(WORD_KEY,words);
29         envelope.bodyOut = soapObject;
30         envelope.dotNet = true;
31         
32             ht.call(SERVICE_NS + methodName, envelope);
33             if(envelope.getResponse() != null){
34                 SoapObject so = (SoapObject)envelope.bodyIn;
35                 List<String> messageList = getTransMessage(so, 0, methodName + "Result");
36                 return messageList;
37             }
38             
39     
40         return null;
41     }
42     
43     private List<String> getTransMessage(SoapObject so, int index, String name_value){
44         
45         SoapObject detail;
46         if(name_value != null && !"".equals(name_value)){
47             detail = (SoapObject)so.getProperty(name_value);
48         }else{
49             detail = (SoapObject)so.getProperty(index);
50         }
51         return parseTransMessage(detail);
52     }
53     private List<String> parseTransMessage(SoapObject detail) {
54         // TODO Auto-generated method stub
55         messageList = new ArrayList<String>();
56         for(int i = 0; i < detail.getPropertyCount(); i++){
57             messageList.add(detail.getProperty(i).toString());
58         }
59         return messageList;
60     }
61 }

 

 

  此段代碼是我這個項目調用Web Service的核心代碼;

  使用ksoap2調用Web Service步驟如下:

  1、創建HttpTransportSE對象(傳送帶),該對象用於調用Web Service。 見代碼23行。

  2、創建SoapSerializationEnvelope對象(裝SOAP信息的信封),見代碼25行。

  3、創建SoapObject對象,創建該對象時需要傳入所需要調用的WebService的命名空間,如何知道所調用的Web Service的命名空間?打開上面提到過的網址,找到你感興趣的Web Service,我這裡是中英翻譯。

  

  

  可以看到WSDL文件的鏈接地址(至於上面的兩個是什麼,有興趣的可以自己點開看看),上面提到過,此文件是Web Service的描述,也就是說明書,此服務的命名空間也會在裡面有所描述,讓我們點開它。

  

  用黃筆畫住的地方:targetNamespace=“WebXml.com.cn”,其中WebXml.com.cn就是此服務的命名空間,在創建SoapObject對象時,將它傳進去就行瞭,至於創建SoapObject的第二個參數,後面會介紹。見代碼27行。

  4、如果有參數需要傳遞給Web Service服務器,調用SoapObject對象的addProperty(String key, Object value)方法,我這裡傳入的是待翻譯的單詞或詞組的數據。見代碼28行。

  5、調用前面創建的SoapSerializationEnvelope對象的setOutputSoapObject()方法,或者直接對bodyOut屬性賦值,將前面創建的SoapObject對象設為SoapSerializationEnvelope的傳出的SOPA。我這裡用的是直接對bodyOut屬性賦值,見代碼29行。

  6、調用HttpTransportSE對象的call()方法,並以SopaSerializationEnvlope作為參數調用遠程Web Service。見代碼:32行。

  7、調用完成後,訪問SoapSerializationEnvelope對象的bodyIn,該屬性會返回一個SopaObjec對象,該對象代表瞭一個Web Service服務端返回的數據,解析該SoapObject就可以得到你想要的數據瞭,見代碼35行,我對數據解析進行瞭封裝。

  上面7步大致講解瞭借助ksoap2調用Web Service服務的步驟,但是有些粗略,下面我將詳細解釋一下。首先第一步,創建HttpTransportSE對象需要一個SERVICE_URL參數,那麼如何獲取這個參數?當你打開WSDL連接時,瀏覽器地址欄顯示的地址,就是該服務的SERVICE_URL,還是看圖:

需要註意的是:我用黃筆畫住的地方是要去掉的,見代碼13行。

  由於是外部調用我這個核心代碼中的方法,所以我還沒有提到methodName這個參數,這個參數是什麼意思呢?說白瞭,通過WSDL文檔大傢可以知道Web Service向調用者暴露瞭那些功能,我們隻需要在call()方法中將你希望使用的功能的名稱(methodName)傳給Web Service就能返回相對應的數據,見代碼27行創建SoapObject對象時會使用到,在執行call()方法時也會用到,不同的是,在這裡需要加上前綴命名空間,見32行。

   我們如何知道Web Service為調用者提供那些方法呢?這些方法的返回值是什麼?這些方法的名稱叫什麼?作用又是什麼?還是需要WSDL文檔來幫助大傢解答上面的問題,我上面說瞭,由於我沒有閱讀過WSDL,也看不懂裡面寫的什麼,也沒有關系,因為大多數的Web Service 都會為使用者提供說明性的舉例文檔。像本應用的舉例文檔在上面的貼圖中也有顯示,我們打開它就能看到如下內容:

  

  上圖隻是對這份文檔進行局部的截圖,首先看第一行紅字,這行字就是Web Service為我們暴露的方法名,然後他的返回值是一個String[],數組的長度已經確定為5個。也就是說,在創建SoapObject時,我們將名為“TranslatorString”的方法名傳進去,調用call()方法後,再從SoapSerializationEnvelope對象的bodyIn屬性中獲取到攜帶瞭數據的SoapObject對象,然後SoapObject對象通過自身的getProperty("TranslatorString"+"Result")方法再獲取出一個SoapObject對象,看過文檔後我們知道,TranslatorString方法返回的是一個固定長度的String[],每個角標所對應的元素內容我們也知道,所以我們可以調用這個最後獲得的SoapObject對象的getProperty(1)方法,獲取到待翻譯詞匯的音標或拼音。getProperty(4)獲取到英文單詞朗讀Mp3名稱……,我這裡是直接for循環後將數據放入到List中以備使用,見代碼53行後。

通過上面7步就可以調用Web Service服務,並獲取到你希望得到的信息瞭,但是,看起來真的很亂,其實可以這樣理解。首先創建的HttpTransportSE(以下簡寫trans)對象可以看做它為一個傳送帶,SoapSerializationEnvelope對象(以下簡寫envelope)為一個郵遞員,SoapObject(以下簡寫so)為一個包裹:

  so.addProperty(WordKey,word):將“詢問”的信息裝入包裹。

  envlope.bodyOut = so:郵遞員拿上Out包裹,待送。

  ht.call(…, envlope)方法:郵遞員拿著包裹,跳上傳送帶去訪問服務器並交換數據。

  SoapObject so = (SoapObject)envlope.bodyIn:從郵遞員身上拿出和服務器交換後的包裹。此包裹與上面的so不是同一個對象

  so.getProperty(…):從包裹中取出“回答”信息。

  以上就是使用ksoap2-android調用Web Service的方式。

  

  下一篇:Sqlite與Web Service共存

 

摘自:One Kid Sky

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *