彭子真++萬勵
摘 要:在WebService網(wǎng)絡(luò)服務(wù)當(dāng)中,相對于傳統(tǒng)的XML,JSON體積更小,解析起來更方便,因此JSON在移動互聯(lián)網(wǎng)的應(yīng)用中優(yōu)勢更為明顯。文章結(jié)合JSON以及HTTP協(xié)議的特性,利用GSON工具和Gzip算法原理,設(shè)計并實現(xiàn)了在JavaEE平臺上與And
roid以及iOS等移動端進行交互的一種接口。
關(guān)鍵詞:WebService技術(shù);JSON數(shù)據(jù);GSON工具;Gzip算法;網(wǎng)絡(luò)接口
1 概述
伴隨“互聯(lián)網(wǎng)+”理念上升至國家戰(zhàn)略層面,移動互聯(lián)網(wǎng)技術(shù)正以難以想象的速度迅猛速度發(fā)展。移動終端作為互聯(lián)網(wǎng)最重要的載體,其發(fā)展對各行各業(yè)都有著深遠的影響。根據(jù)QuestMobile發(fā)布的《2015年中國移動互聯(lián)網(wǎng)研究報告》顯示,國內(nèi)移動智能設(shè)備的活躍數(shù)量將近9億,其中蘋果設(shè)備占比三成[1]。因此設(shè)計一種使用安全、簡單可用于移動互聯(lián)的接口就具有非常大的意義了。
SOA是一種以松耦合方式實現(xiàn)處理異構(gòu)系統(tǒng)數(shù)據(jù)交互的面向服務(wù)的方法。WebService則是該方法的一種實現(xiàn)規(guī)范,WebService主要由解決對象互訪問的SOAP協(xié)議、描述具體業(yè)務(wù)服務(wù)的WSDL文件和負責(zé)注冊服務(wù)的UDDI注冊中心三個模塊組成[2]。WebService以XML(可拓展標(biāo)記語言)作為數(shù)據(jù)交互的格式,XML數(shù)據(jù)主要以O(shè)pen和Closing標(biāo)記組成,具備較高的可讀性,但是在解釋速度和傳輸速率上面效果較差,并不是移動互聯(lián)網(wǎng)使用場景的最佳方案[3]。REST是一種適合于客戶端與服務(wù)器端交互的一種架構(gòu)風(fēng)格,該風(fēng)格更簡單、更有層次,也更容易實現(xiàn)緩存等機制,而REST最簡單的實現(xiàn)技術(shù)則是JSON(Java Script Object Notation)技術(shù)。
2 JSON與GSON
2.1 JSON概述
JSON是一種以大括號、中括號等符號表達的輕量級(Lightweight,具有平臺移植性)交換格式。JSON使用“名稱/值”的方式組織數(shù)據(jù),在占用體積極低的情況之下,仍然能以便捷的方式反向分析出數(shù)據(jù)源,同時以有序列表的方式直接表達對象列表,極大兼容了面向?qū)ο缶幊谭绞健?/p>
2.2 GSON工具
JSON屬于Javascript的一個子集,早期多用于Web服務(wù)。隨著JSON的快速發(fā)展和普及,很多平臺均對該數(shù)據(jù)格式進行了支持。GSON(又稱Google GSON)是Google公司發(fā)布的一個開放源代碼的Java庫,主要用途是將Java對象序列化為JSON字符串,或反序列化JSON字符串成Java對象。該工具的應(yīng)用,不僅容易生成小體積的JSON數(shù)據(jù),更從整體上簡化了JSON數(shù)據(jù)開發(fā)的各個環(huán)節(jié),降低了技術(shù)難度。
3 交互接口的設(shè)計
3.1 功能需求概述
本文以筆者近期參與的“周末玩乜 出游助理”項目的建設(shè)為例。該項目是以短期周末鄉(xiāng)村游為切入點,結(jié)合兩廣區(qū)域旅游特色而開發(fā)的平臺,以解決當(dāng)前旅游App市場上鄉(xiāng)村游資源豐富而相關(guān)數(shù)據(jù)卻匱乏的問題。該平臺主要包括景點管理、產(chǎn)品管理、消費體系、結(jié)伴游、攻略、出游助理等功能模塊。
3.2 移動終端與服務(wù)器交互接口體系結(jié)構(gòu)的設(shè)計
考慮到旅游平臺不僅需要有面向管理員以及商家的Web管理平臺,還需要有適合用戶戶外使用的Android端或iOS端,可能后續(xù)還會拓展到其他終端。因此,平臺必須要設(shè)計出符合以下約束的交互接口:
(1)接口訪問敏感數(shù)據(jù)需要進行嚴(yán)格完整的身份認證,且達到業(yè)務(wù)發(fā)展之后對高可拓展性的要求。
(2)需要考慮無線環(huán)境下流量損耗的問題。
(3)為了功能同步,Android端以及iOS使用同一套接口。
(4)考慮到團隊技術(shù)能力以及系統(tǒng)穩(wěn)健性,要求技術(shù)簡單可行。
綜合以上四個條件,本文擬使用HTTP協(xié)議以及JSON數(shù)據(jù)進行REST風(fēng)格接口的設(shè)計,同時使用GSON工具包對JSON進行轉(zhuǎn)換。整個過程為:通過HTTP協(xié)議中的request包裝POST數(shù)據(jù)傳輸命令,以response返回JSON數(shù)據(jù)包的方式最終完成交互,其中,使用GSON工具包在服務(wù)器生成JSON,以及在客戶端解析JSON;Gzip主要用于服務(wù)器傳輸前的數(shù)據(jù)壓縮以及客戶端接收之后的數(shù)據(jù)解壓。具體體系結(jié)構(gòu)如圖1所示。
服務(wù)器原有架構(gòu)設(shè)計在RUP4+1架構(gòu)體系的基礎(chǔ)上結(jié)合分層以及MVC模式,設(shè)計出了自上而下的包括視圖層、控制層、業(yè)務(wù)層和數(shù)據(jù)持久層在內(nèi)的4層結(jié)構(gòu)。而移動端無論是Android或者iOS,均把網(wǎng)絡(luò)傳輸以及JSON數(shù)據(jù)的解釋等功能抽取成了組件。在此基礎(chǔ)上,總體設(shè)計可以結(jié)合以下幾個方面的設(shè)計,最終完成圖1所示的移動終端與服務(wù)器交互接口的體系結(jié)構(gòu)的設(shè)計:
(1)服務(wù)器端過濾器安全認證設(shè)計。如果直接在POST的數(shù)據(jù)當(dāng)中封裝令牌,將會導(dǎo)致業(yè)務(wù)數(shù)據(jù)與安全驗證的高度耦合,同時增加了程序的復(fù)雜度和可理解度。因此在每次傳輸之前,把安全認證信息封裝到POST方式的Header數(shù)據(jù)當(dāng)中,服務(wù)器則在進入具體控制器之前使用整體的過濾器完成整個系統(tǒng)的權(quán)限認證。
(2)服務(wù)器端控制層的設(shè)計。在不改變Web版控制層代碼的情況下,創(chuàng)建新的安裝包com.gxuwz.TravelToolWeb.action.ap,并在當(dāng)中增加與移動端交互的Action。通過調(diào)用GSON組件快速把在調(diào)用業(yè)務(wù)層時得到的對象等數(shù)據(jù)轉(zhuǎn)化為JSON的數(shù)據(jù)包,隨后直接使用這些數(shù)據(jù)包,并且使用Gzip壓縮之后返回給客戶端。
(3)移動端接口設(shè)計。由于Android或iOS把網(wǎng)絡(luò)連接模塊抽取成了網(wǎng)絡(luò)組件,把GSON工具包抽取成了JSON對象轉(zhuǎn)換組件,所以在發(fā)送階段可使用網(wǎng)絡(luò)組件直接把Header數(shù)據(jù)封裝到POST并進行傳輸。在接收處理階段,先使用Gzip組件解壓縮得到JSON數(shù)據(jù)包,接著使用轉(zhuǎn)換組件把JSON數(shù)據(jù)表直接轉(zhuǎn)換為本地對象的數(shù)據(jù)包,最后移動端則像使用本地對象一樣使用該轉(zhuǎn)換數(shù)據(jù)。
4 交互接口的實現(xiàn)
當(dāng)前包括Android和iOS等在內(nèi)的移動端均支持HTTP協(xié)議,移動端與服務(wù)器端的交互方式主要利用HTTP協(xié)議當(dāng)中POST方式傳輸為主。本文使用GSON生成的用于傳輸?shù)腏SON數(shù)據(jù)的格式,利用POST方式的Header數(shù)據(jù)頭隱藏解決安全問題的密鑰,并使用Gzip算法對JSON數(shù)據(jù)進行壓縮,最終完成整個接口的實現(xiàn)。整體上實現(xiàn)步驟以及調(diào)用邏輯如圖2序列圖所示。
4.1 利用GSON生成和解析JSON數(shù)據(jù)包
GSON對JSON做了最大的支持,在對外的接口當(dāng)中,主要以to
Json方法生成JSON數(shù)據(jù)包,使用fromJson把JSON數(shù)據(jù)包映射為內(nèi)部的對象或者對象列表。
其中,在服務(wù)器端控制器Action調(diào)用業(yè)務(wù)得到數(shù)據(jù)之后,直接使用toJson方法把內(nèi)部數(shù)據(jù)直接生成JSON數(shù)據(jù)格式。
同理,Android等移動客戶端只需要引入GSON組件并調(diào)用fromJson即可反向把JSON數(shù)據(jù)生成內(nèi)部對象或者列表。
4.2 設(shè)計安全的數(shù)據(jù)請求機制
利用POST的傳輸方式,實現(xiàn)接口的安全機制。在移動端當(dāng)中,把安全訪問密鑰、版本號以及訪問端的平臺等校驗數(shù)據(jù)封裝在POST的Header數(shù)據(jù)當(dāng)中。
在JavaEE平臺當(dāng)中,F(xiàn)ilter是一種對web資源進行管理的技術(shù),其核心的機制是在進入Servlet等控制器之前優(yōu)先執(zhí)行,可以實現(xiàn)URL級別的權(quán)限訪問控制、過濾敏感詞匯、壓縮響應(yīng)信息等一些高級功能。Filter包含了內(nèi)置對象request以及response,因此可以非常方便地在request中獲取Header數(shù)據(jù),根據(jù)校驗結(jié)果在response中控制跳轉(zhuǎn)到指定的資源,以實現(xiàn)權(quán)限認證的操作。
4.3 使用Gzip壓縮算法對JSON數(shù)據(jù)進行優(yōu)化
對于XML傳輸格式而言,JSON的數(shù)據(jù)量已經(jīng)非常小,但是對于字符較多的數(shù)據(jù)列表的傳輸而言,傳輸?shù)臄?shù)據(jù)量還是較大的。故可以使用Gzip算法對JSON進行壓縮。在包括JavaEE以及Android在內(nèi)的Java平臺當(dāng)中,均已提供了用Gzip算法壓縮JSON的技術(shù)實現(xiàn)方式。例如直接在服務(wù)器控制端生成JSON之后,傳輸之前,調(diào)用Java的GZIPOutputStream類用于壓縮JSON數(shù)據(jù)包。而在Android移動端,接收到數(shù)據(jù)之后,解析JSON之前,直接GZIPInputStream類解壓縮即可得到JSON字符。
5 實現(xiàn)效果分析
在目標(biāo)系統(tǒng)“周末玩乜 出游助理”的使用場景當(dāng)中,以最有代表性的三種應(yīng)用場景為例,說明優(yōu)化的效率。這三種應(yīng)用場景分別為:獲取景點列表、獲取單個景點對象和獲取操作狀態(tài)的單個值?,F(xiàn)分別對這三種返回類型從XML、JSON以及使用Gzip壓縮之后的JSON(下稱壓縮JSON)的格式進行數(shù)據(jù)包測試,測試結(jié)果如表1所示:
由表1的數(shù)據(jù)得到圖3分析圖。景點列表元素不多,但是內(nèi)部包含比較長的景點介紹的文本;景點對象元素較多但單個元素數(shù)據(jù)量較??;操作狀態(tài)僅僅是單個字符。由此可知,在單個狀態(tài)字符的情況下,JSON格式的優(yōu)勢并不明顯;在列表對象這種字符元素較少、單個元素字符非常大的情況下有一定優(yōu)勢;而對于常規(guī)的元素較多而單個值字符較少的情況,壓縮JSON則是最好的選擇。
6 結(jié)束語
本文以項目“周末玩乜 出游助理”的實際需求為背景,提出了基于GSON技術(shù)和Gzip技術(shù)實現(xiàn)的移動端與服務(wù)器交互接口的設(shè)計與實現(xiàn)。首先由于GSON以及OKHttp等組件的使用,降低了開發(fā)難度,也降低了移動互聯(lián)網(wǎng)數(shù)據(jù)的損耗;其次把認證信息封裝到POST協(xié)議的Header的方式,以一種非常簡單的手法解決了JSON的安全問題;最后使用Gzip算法對JSON數(shù)據(jù)進行壓縮講交互接口的傳輸效率調(diào)節(jié)到了最佳狀態(tài)。整體上來說,該接口的實現(xiàn)不僅解決了iOS和Android等移動端與服務(wù)器互通信息和共享資源難的問題,也達到了低耦合、低成本、可拓展性強、高效和高安全性的要求。
參考文獻
[1]李天昀.2015年中國互聯(lián)網(wǎng)產(chǎn)業(yè)發(fā)展報告[J].現(xiàn)代傳播(中國傳媒大學(xué)學(xué)報),2016(08):8.
[2]陳峰震.基于調(diào)用Web Service的Android應(yīng)用開發(fā)技術(shù)研究[J].福建電腦,2015(3):24.
[3]譚翔緯.利用JSON實現(xiàn)Android客戶端與Web服務(wù)器間的數(shù)據(jù)交互[J].福建電腦,2013(02):166.
作者簡介:彭子真(1987-),女,漢族,廣西浦北,在讀工程碩士,研究方向:軟件工程。
萬勵(1972-),女,漢族,廣西平南,碩士,副教授,研究方向:軟件工程、圖象處理。