熊國華
摘要:利用手持設備進行移動辦公已經(jīng)成為一種趨勢,由于手持設備難以進行大型的數(shù)據(jù)庫存儲和軟件應用,且手持設備與服務端的平臺與技術也不盡相同,因此相互之間如何進行高效的數(shù)據(jù)交互就成為亟待解決的問題,針對這一問題,該文在研究WCF與REST風格的基礎上,對Android平臺客戶端與.NET服務端之間的數(shù)據(jù)交互進行了設計與實現(xiàn)。
關鍵詞: REST風格服務; WCF ; Android
中圖分類號:TP309 文獻標識碼:A 文章編號:1009-3044(2014)16-3803-04
Abstract:Using handheld devices for mobile officing has become a trend. But it is difficult for handheld devices to carry out Large-scale data storage and software application. And these platforms and technologies are not the same Between the handheld device and server. However it had been a problem of desiderate to solve that how to make an efficient data exchange m between them. For this case, this paper research WCF and REST style services, then the data exchange between Android Client and .NET Server is designed and realized.
Key words: REST style services; WCF; Android
由于Android系統(tǒng)的開放性和免費服務,使得其成為現(xiàn)今手持式移動設備(如平板電腦、智能手機等)的主流操作系統(tǒng),而手持式移動設備也逐漸成為了企業(yè)信息化過程中不可或缺的一部分。但手持式移動設備由于硬件的限制難以進行大型的數(shù)據(jù)庫存儲和軟件應用,在企業(yè)信息化過程中往往處于客戶端的角色,且與服務端的平臺與技術也不盡相同,因此其與服務端之間的高效數(shù)據(jù)交互就成為急需解決的問題。
手持式移動設備大多數(shù)基于Android系統(tǒng),因此客戶端的實現(xiàn)一般采用JAVA平臺;而服務端很多采用Microsoft .NET平臺。對于異構系統(tǒng)間的數(shù)據(jù)交互,制定一定的數(shù)據(jù)交換標準是真正解決異構系統(tǒng)數(shù)據(jù)不一致問題的根本途徑,雖然傳統(tǒng)的Socket、TCP通信技術實現(xiàn)起來簡單,但是編程復雜度高、消息解析麻煩[1]。Web Service的出現(xiàn)解決了異構系統(tǒng)間無縫銜接的技術,它主要有兩種風格,一種是XML,另一種是REST。由于REST最突出的特性在于回歸了Web的資源性和簡單性,棄用了基于SOAP和WSDL等復雜的接口,而采用了更易用、面向資源的模型來公開服務,因此可以開發(fā)出具有更好交互功能和可伸縮性的Web服務。
1 WCF與RESTful Web Services
1.1 WCF
WCF(Windows Communication Foundation,Windows通信基礎)是微軟公司為了支持SOA(Service Oriented Architecture,面向服務的架構)而推出的基于Windows平臺開發(fā)部署軟件的SDK,它整合了.NET平臺下所有與分布式系統(tǒng)相關的技術(如XML Web Service、WSE、.NET Remoting、Enterprise Service以及MSMQ等),為分布式系統(tǒng)的開發(fā)提供一個統(tǒng)一的編程模型。
WCF是一個基于消息的通信框架,采用基于終結(jié)點(Endpoint)的通信手段。終結(jié)點由地址(Address)、綁定(Binding)和契約(Contract)三要素組成[2]:
地址(Address):包含兩個重要的元素,即服務位置和傳輸協(xié)議或用于服務通信的傳輸樣式,主要用于解決服務尋址的問題。地址通信常用格式為[基地址]/[可選的URL],而基地址通常采用的格式為[傳輸協(xié)議]://[機器名或域名][:可選端口]。
綁定(Binding):綁定實現(xiàn)了通信的所有細節(jié),包括網(wǎng)絡傳輸、消息編碼,以及其他為實現(xiàn)某種功能(比如安全、可靠傳輸、事務等)對消息進行的相應處理。WCF中具有一系列的系統(tǒng)定義綁定,比如WebHttpBinding、BasicHttpBinding、WsHttpBinding、NetTcpBinding等。
契約(Contract):契約與平臺無關,是對服務操作的抽象,也是對消息交換模式以及消息結(jié)構的定義。WCF定義的契約有服務契約(Service Contract)、數(shù)據(jù)契約(Data Contract)、錯誤契約(Fault Contract)和消息契約(Message Contract)四種。
1.2 RESTful Web Services
在.NET Framework 3.0中,WCF是不具備RESTful功能的,RESTful作為WCF的一個擴展功能是在.NET Framework 3.5以后版本中才包含進來。REST的全稱是Representation State Transfer,最早是Roy Thomas Fielding在他的博士論文中的第五章提出。REST不是一種軟件架構,而是對Web體系結(jié)構設計原則的抽象和描述[3]。它包含一組架構約束條件和原則,滿足這些約束條件和原則的應用程序或設計就是 RESTful風格的。而符合RESTful風格的Web Services,就是我們所說的RESTful Web Services。在REST中,很重要的一個概念是Resource,Resource可以是文檔、圖片、一個短暫的服務,甚至可以是真實的人等[4]。每個Resource都由一個URL來標識,目前有三種URL格式用來標識Resource,用得較多的一種是以“/”分割參數(shù)的方式[5],例如在Google中獲取某個用戶所創(chuàng)建的日歷(Calendar)的URL格式為:endprint
http://www.google.com/calendar/feeds/userID/private-magicCookie/full,其中userID為Google賬號。
2 客戶端與.NET服務端之間數(shù)據(jù)交互的實現(xiàn)
筆者以一個經(jīng)銷商平臺為例,客戶端與服務端的數(shù)據(jù)交互流程如圖1所示。
根據(jù)數(shù)據(jù)交互流程圖,服務端必須提供四個接口,分別為驗證用戶名和密碼接口、下載服務端數(shù)據(jù)表接口、下載服務端圖片接口和訂單上傳接口。要實現(xiàn)數(shù)據(jù)交互,首先必須確定數(shù)據(jù)傳輸格式,然后進行服務端設計以給客戶端提供Web Services,最后實現(xiàn)客戶端對服務端Web Services的調(diào)用。
2.1 數(shù)據(jù)傳輸格式的選擇
目前數(shù)據(jù)傳輸格式大多采用XML、FSV和JSON,目前已有對這三種數(shù)據(jù)格式傳輸開銷的研究[6]。研究證明:以JSON格式傳輸數(shù)據(jù)所消耗的時間明顯短于以XML格式傳輸數(shù)據(jù)所消耗的時間,而略短于FSV傳輸數(shù)據(jù)消耗的時間; JSON反序列化時間也明顯小于XML反序列化時間;同時JSON 便于閱讀和編碼,又是JavaScript規(guī)范的子集,便于機器解析,減少了解析XML帶來的性能和兼容性問題。因此選擇JSON格式作為移動設備客戶端與服務端之間的數(shù)據(jù)傳輸格式是最適合的。
JSON支持兩種結(jié)構[7]:
第一種結(jié)構是“名稱/值”對集合,也稱對象結(jié)構,以“{”開始,“}”結(jié)束,每個“名稱/值”對中間用“:”分隔”,多對“名稱/值”之間使用“,”將其分隔。其結(jié)構如圖2所示。
下面是一個簡單示例:
var customer={" customerID":"C001","contact":"tom","phone":"13900000000"}
這個對象包含了3個元素customerID;contact;phone,它們的值分別是C001;tom;13900000000。
第二種結(jié)構是有序值列表,也稱數(shù)組結(jié)構,以“[”開始,“]”結(jié)束, “值”之間使用“,”將其分隔。結(jié)構如圖3所示。
下面是一個簡單示例:
var customerIDList={"C001","C002"," C003"}
這個示例表明在數(shù)組customerIDList中包含3個元素' C001',' C002' ,' C003'。
要注意的是:名稱一般為字符串形式,而值可以是雙引號括起來的字符串、數(shù)字、true、false、null,也可以是一個對象甚至是一個數(shù)組結(jié)構,并且這些值之間可以互相嵌套。
2.2 服務端設計
WCF的核心有兩個,一個是終結(jié)點的配置,另一個是服務接口的實現(xiàn),下面分別講述其實現(xiàn)。
3.2.1 WCF Endpoint配置
在web.config文件services節(jié)中進行如下設置,具體代碼如下:
以上代碼是以管理方式配置終結(jié)點,其中“Test_WcfService.TestService”用于指定命名空間,“http://localhost:8090/TestWcf/TestService.svc”用于指明基地址,而綁定方式“webHttpBinding”是指WCF所提供支持Web編程模型的綁定。
2.2.2 數(shù)據(jù)接口實現(xiàn)
下面以驗證用戶名和密碼接口為例,接口實現(xiàn)思路如圖4所示,其它接口可以參考該接口進行實現(xiàn)。
數(shù)據(jù)接口實現(xiàn)后,接下公開URL以便客戶端調(diào)用,如:http://localhost:8090/TestWcf/TestService.svc/login
2.3 客戶端設計
由于Android程序?qū)σ恍┟舾行畔⒌脑L問權限進行了控制,而對REST風格服務的調(diào)用又需要通過網(wǎng)絡進行,因此在客戶端程序的全局配置文件中開放應用的網(wǎng)絡連接權限。
本客戶端采用了HttpURLConnection接口來實現(xiàn)對服務的調(diào)用,在建立HTTP連接的基礎上對HTTP報頭屬性進行相應的設置,通過HTTP報頭傳遞相應的狀態(tài)信息。對REST風格服務進行HTTP調(diào)用時,首先要通過openConnection方法獲得一個連接對象,然后對HTTP報頭的屬性進行設置,并將請求正文輸入到輸出流中,最后將請求發(fā)送,根據(jù)服務端響應的內(nèi)容進行相應的操作。
下面以驗證客戶端用戶名及密碼的合法性為例,采用POST請求方式對REST風格服務進行調(diào)用.其它請求方式也可以此作為參照具體方法如下:
URL url=new URL(address);//address為驗證用戶名及密碼接口URL
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethed("POST");//設置請求方式
connection.setDoInput(true);//允許輸入
connection.setDoOutput(true);//允許輸出
connection.setRequestProperty("Accept"," application/json ");//設置接受文檔格式
connection.setRequestProperty("Content-Type", "application/json");//設置發(fā)送文檔格式
connection.connect();
//POST請求
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
JSONObject obj = new JSONObject();
obj.element("Account ", "tom");
obj.element("Password ", "202cb962ac59075b964b07152d234b70");//密碼用MD5加密
out.writeBytes(obj.toString());
out.flush();
out.close();
//讀取響應
if(connection.getResponseCode()==connection.HTTP-OK){
//請求響應成功的相應操作
}else{//請求響應的其他相應操作
}// 斷開連接
connection.disconnect();
3 結(jié)束語
本文在研究WCF與REST風格的基礎上,并以一個經(jīng)銷商平臺的實現(xiàn)為例分別對Android平臺客戶端與.NET服務端數(shù)據(jù)接口進行了設計與實現(xiàn)。實踐證明,利用REST風格服務在跨平臺數(shù)據(jù)交互不僅編程簡單、靈活性好、效率高,更重要是具有很好的安全性。
參考文獻:
[1] 朱夏,王茜.異構系統(tǒng)間數(shù)據(jù)交換模型的設計與實現(xiàn)[J].東南大學學報:自然科學版, 2006, 36(2):226-227.
[2] Juval L?wy. WCF服務編程[M].徐雷,徐揚,譯.武漢:華中科技大學出版社.2011.
[3] 陳亮.基于面向資源架構的REST方式Web服務的開發(fā)方法[J].信息科技,2008(22):110-111.
[4] Roy Thomas Fielding.Architectural Styles and the Design of Network based Software Architectures[D].UNIVERSITY OF CALIFORNIA,2000:88.
[5] 袁贊.Java與RESTful Web Services[J].電腦知識與技術:學術交流,2007(21).
[6] 高靜,段會川.JSON數(shù)據(jù)傳輸效率研究[J].計算機工程與設計,2011, 32(7):2267-2270.
[7] JSON[EB/OL]. http://www.json.org.endprint
下面以驗證客戶端用戶名及密碼的合法性為例,采用POST請求方式對REST風格服務進行調(diào)用.其它請求方式也可以此作為參照具體方法如下:
URL url=new URL(address);//address為驗證用戶名及密碼接口URL
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethed("POST");//設置請求方式
connection.setDoInput(true);//允許輸入
connection.setDoOutput(true);//允許輸出
connection.setRequestProperty("Accept"," application/json ");//設置接受文檔格式
connection.setRequestProperty("Content-Type", "application/json");//設置發(fā)送文檔格式
connection.connect();
//POST請求
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
JSONObject obj = new JSONObject();
obj.element("Account ", "tom");
obj.element("Password ", "202cb962ac59075b964b07152d234b70");//密碼用MD5加密
out.writeBytes(obj.toString());
out.flush();
out.close();
//讀取響應
if(connection.getResponseCode()==connection.HTTP-OK){
//請求響應成功的相應操作
}else{//請求響應的其他相應操作
}// 斷開連接
connection.disconnect();
3 結(jié)束語
本文在研究WCF與REST風格的基礎上,并以一個經(jīng)銷商平臺的實現(xiàn)為例分別對Android平臺客戶端與.NET服務端數(shù)據(jù)接口進行了設計與實現(xiàn)。實踐證明,利用REST風格服務在跨平臺數(shù)據(jù)交互不僅編程簡單、靈活性好、效率高,更重要是具有很好的安全性。
參考文獻:
[1] 朱夏,王茜.異構系統(tǒng)間數(shù)據(jù)交換模型的設計與實現(xiàn)[J].東南大學學報:自然科學版, 2006, 36(2):226-227.
[2] Juval L?wy. WCF服務編程[M].徐雷,徐揚,譯.武漢:華中科技大學出版社.2011.
[3] 陳亮.基于面向資源架構的REST方式Web服務的開發(fā)方法[J].信息科技,2008(22):110-111.
[4] Roy Thomas Fielding.Architectural Styles and the Design of Network based Software Architectures[D].UNIVERSITY OF CALIFORNIA,2000:88.
[5] 袁贊.Java與RESTful Web Services[J].電腦知識與技術:學術交流,2007(21).
[6] 高靜,段會川.JSON數(shù)據(jù)傳輸效率研究[J].計算機工程與設計,2011, 32(7):2267-2270.
[7] JSON[EB/OL]. http://www.json.org.endprint
下面以驗證客戶端用戶名及密碼的合法性為例,采用POST請求方式對REST風格服務進行調(diào)用.其它請求方式也可以此作為參照具體方法如下:
URL url=new URL(address);//address為驗證用戶名及密碼接口URL
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.setRequestMethed("POST");//設置請求方式
connection.setDoInput(true);//允許輸入
connection.setDoOutput(true);//允許輸出
connection.setRequestProperty("Accept"," application/json ");//設置接受文檔格式
connection.setRequestProperty("Content-Type", "application/json");//設置發(fā)送文檔格式
connection.connect();
//POST請求
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
JSONObject obj = new JSONObject();
obj.element("Account ", "tom");
obj.element("Password ", "202cb962ac59075b964b07152d234b70");//密碼用MD5加密
out.writeBytes(obj.toString());
out.flush();
out.close();
//讀取響應
if(connection.getResponseCode()==connection.HTTP-OK){
//請求響應成功的相應操作
}else{//請求響應的其他相應操作
}// 斷開連接
connection.disconnect();
3 結(jié)束語
本文在研究WCF與REST風格的基礎上,并以一個經(jīng)銷商平臺的實現(xiàn)為例分別對Android平臺客戶端與.NET服務端數(shù)據(jù)接口進行了設計與實現(xiàn)。實踐證明,利用REST風格服務在跨平臺數(shù)據(jù)交互不僅編程簡單、靈活性好、效率高,更重要是具有很好的安全性。
參考文獻:
[1] 朱夏,王茜.異構系統(tǒng)間數(shù)據(jù)交換模型的設計與實現(xiàn)[J].東南大學學報:自然科學版, 2006, 36(2):226-227.
[2] Juval L?wy. WCF服務編程[M].徐雷,徐揚,譯.武漢:華中科技大學出版社.2011.
[3] 陳亮.基于面向資源架構的REST方式Web服務的開發(fā)方法[J].信息科技,2008(22):110-111.
[4] Roy Thomas Fielding.Architectural Styles and the Design of Network based Software Architectures[D].UNIVERSITY OF CALIFORNIA,2000:88.
[5] 袁贊.Java與RESTful Web Services[J].電腦知識與技術:學術交流,2007(21).
[6] 高靜,段會川.JSON數(shù)據(jù)傳輸效率研究[J].計算機工程與設計,2011, 32(7):2267-2270.
[7] JSON[EB/OL]. http://www.json.org.endprint