巫志勇
摘要:該文介紹了在Android開(kāi)發(fā)中Web Service功能的實(shí)現(xiàn)。并設(shè)計(jì)了一個(gè)國(guó)內(nèi)手機(jī)號(hào)碼歸屬地查詢的程序,研究通過(guò)Web Ser? vice遠(yuǎn)程調(diào)用來(lái)獲取數(shù)據(jù)的方式。
關(guān)鍵詞:Android;Web Service;ksoap2
中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)20-4904-03
In the Development of Android Web Service Network Programming Research
WU Zhi-yong
(Guangdong Female Polytechnic College, Guangzhou 511450, China)
Abstract: This paper describes the implement of Web Services functionality on Android platform. And design a program for inquiries to phone numbers attribution, to show the way to remote calls Web Service function.
Key words: Android; Web Service; ksoap2
Web Service是一種面向服務(wù)架構(gòu)(Service-oriented architecture,SOA)的技術(shù),目的是實(shí)現(xiàn)不同平臺(tái)的應(yīng)用服務(wù)之間的相互調(diào)用。Android作為一個(gè)市場(chǎng)占有率第一的移動(dòng)操作系統(tǒng),其網(wǎng)絡(luò)功能是最重要的特性之一。在Android開(kāi)發(fā)中通過(guò)Web Service可以方便地實(shí)現(xiàn)不同平臺(tái)之間的方法調(diào)用,從網(wǎng)上獲取數(shù)據(jù)信息和實(shí)現(xiàn)功能擴(kuò)展。Web Service通過(guò)標(biāo)準(zhǔn)的Web協(xié)議提供服務(wù)。
通過(guò)Web Service實(shí)現(xiàn)遠(yuǎn)程方法調(diào)用,獲取數(shù)據(jù)信息,最關(guān)鍵的問(wèn)題是數(shù)據(jù)訪問(wèn)和傳輸?shù)膮f(xié)議規(guī)范。
SOAP協(xié)議(Simple Object Access Protocal,簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議),它是一個(gè)分布式網(wǎng)絡(luò)環(huán)境下用于信息交換的通訊協(xié)議。在此協(xié)議下,應(yīng)用程序和軟件組件可以通過(guò)標(biāo)準(zhǔn)的Web協(xié)議進(jìn)行通訊。SOAP使用基于XML的可擴(kuò)展消息格式,需同時(shí)綁定一個(gè)傳輸用協(xié)議。這個(gè)協(xié)議通常是HTTP或HTTPS,但也可以使用SMTP或XMPP。
WSDL是一個(gè)XML格式文檔,用以描述服務(wù)端口訪問(wèn)方式和使用協(xié)議的細(xì)節(jié)。通常用來(lái)輔助生成服務(wù)器和客戶端代碼及配置信息。
UDDI是用來(lái)發(fā)布和搜索WEB服務(wù)的協(xié)議,應(yīng)用程序可藉由此協(xié)議在設(shè)計(jì)或運(yùn)行時(shí)找到目標(biāo)WEB服務(wù)。
Java開(kāi)發(fā)中的Web Service有很多種實(shí)現(xiàn)方式,如XML-RPC、XFile、Axis等等,可是這些庫(kù)并不適合資源有限的Android手機(jī)客戶端。在Java ME版本中,廣泛使用的是KSOAP。雖然Android并不使用Java ME,但是KSOAP也有Android下的可用版本ksoap2-Android。
2.1 ksoap2-Android
kSOAP是Enhydra.org的一個(gè)開(kāi)源作品,是EnhydraME項(xiàng)目的一部分。ksoap2-Android是ksoap2在Android下的一個(gè)移植版本,利用它可以非常方便地訪問(wèn)Web Service。ksoap2的常用接口有:
org.ksoap2. SoapObject
org.ksoap2. SoapEnvelope
org.ksoap2. SoapSerializationEnvelope
org.ksoap2.transport. HttpTransport
SoapObject用于創(chuàng)建SOAP對(duì)象,實(shí)現(xiàn)SOAP調(diào)用;
SoapEnvelope實(shí)現(xiàn)了SOAP標(biāo)準(zhǔn)中的SOAP Envelope,封裝了head對(duì)象和body對(duì)象。
SoapSerializationEnvelope是ksoap2中對(duì)SoapEnvelope的擴(kuò)展,支持SOAP序列化(Serialization)格式規(guī)范,可以對(duì)簡(jiǎn)單對(duì)象自動(dòng)進(jìn)行序列化(Simple object serialization)。
HttpTransport用于進(jìn)行Internet訪問(wèn)/請(qǐng)求,獲取服務(wù)器SOAP。
2.2 ksoap2-Android的編譯配置
圖1
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/phonenumber" /><EditText
android:id="@+id/EditTextPhoneNumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="phone" >
<requestFocus /></EditText><Button
android:id="@+id/btnCheck"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btnCheck" />
3.2查詢的代碼
當(dāng)輸入手機(jī)號(hào)碼,點(diǎn)擊查詢按鈕時(shí),訪問(wèn)Web Service,遠(yuǎn)程調(diào)用getMobileCodeInfo方法來(lái)獲得查詢結(jié)果。訪問(wèn)Web Service的步驟如下:
1)實(shí)例化SoapObject對(duì)象,指定webService的命名空間和調(diào)用的方法名稱。
String serviceNameSpace = "http://WebXml.com.cn/";
String methodName = "getMobileCodeInfo";
SoapObject request = new SoapObject(serviceNameSpace,methodName);
2)設(shè)置調(diào)用方法的參數(shù)。根據(jù)服務(wù)提供方描述的參數(shù)要求,需要兩個(gè)參數(shù)。第一個(gè)為mobileCode,字符串類型,表示手機(jī)號(hào)碼,第二個(gè)為userID為商業(yè)用戶ID,免費(fèi)用戶為空字符串。
request.addProperty("mobileCode", strPhoneNumber);
request.addProperty("userID", "");
3)通過(guò)實(shí)例化Envelope對(duì)象,設(shè)置SOAP請(qǐng)求信息,并注冊(cè)Envelope對(duì)象。對(duì)應(yīng)于不同的SOAP規(guī)范,需要使用不同的常量作為參數(shù)。常量SoapEnvelope.VER10:對(duì)應(yīng)于SOAP 1.0規(guī)范;常量SoapEnvelope.VER11:對(duì)應(yīng)于SOAP 1.1規(guī)范;常量SoapEnvelope. VER12:對(duì)應(yīng)于SOAP 1.2規(guī)范。
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
(new MarshalBase64()).register(envelope);
4)實(shí)例化傳輸對(duì)象,參數(shù)為傳遞SOAP數(shù)據(jù)的目標(biāo)地址,即WSDL文檔的URL。HttpTransportSE是一個(gè)強(qiáng)大的Http傳輸類,可以完成Http傳輸過(guò)程。它封裝了網(wǎng)絡(luò)請(qǐng)求的一切,可以完全不用考慮序列化消息。通過(guò)把它的debug屬性設(shè)置為true來(lái)啟用調(diào)試信息。
String serviceURL = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
HttpTransportSE transport = new HttpTransportSE(serviceURL);
transport.debug = true;
5)獲取返回結(jié)果,并進(jìn)行解析。
返回?cái)?shù)據(jù)為字符串(手機(jī)號(hào)碼:省份城市手機(jī)卡類型)。
if(envelope.getResponse()!=null){
return (envelope.bodyIn.toString());
}
在Android開(kāi)發(fā)中使用ksoap2-Android可以很方便地實(shí)現(xiàn)Web Service功能,通過(guò)Web Service遠(yuǎn)程調(diào)用來(lái)獲取數(shù)據(jù)。但是在開(kāi)發(fā)中發(fā)現(xiàn),直接訪問(wèn)Web Service來(lái)獲取數(shù)據(jù),會(huì)由于網(wǎng)絡(luò)的延時(shí)而造成界面響應(yīng)的短暫停頓,應(yīng)該研究更好的方法,如通過(guò)后臺(tái)異步數(shù)據(jù)傳輸來(lái)解決。