胡 飛,楊華千,彭 濤,蒲昌玖
(重慶教育學(xué)院網(wǎng)絡(luò)中心,重慶 400067)
在龐大的互聯(lián)網(wǎng)上服務(wù)器平臺和應(yīng)用越來越多,如何讓異構(gòu)的服務(wù)器平臺連接為一個整體?在十年前還是一個遙不可及的技術(shù)。近年來Web遠(yuǎn)程過程調(diào)用技術(shù)的迅猛發(fā)展,從最初簡單的Iframe嵌入式頁面到后來的Web Service,已經(jīng)解決了此問題。異構(gòu)服務(wù)器之間只需要通過基于HTTP協(xié)議的應(yīng)用即可相互調(diào)用方法和內(nèi)容。Web Service是這方面的技術(shù)龍頭,但是其使用復(fù)雜、對編程能力要求高、需要刷新整個頁面從而浪費帶寬和服務(wù)器資源等缺點,由此提出了一種在不刷新頁面的前提下,對遠(yuǎn)程方法進(jìn)行調(diào)用,且對編程能力要求不高的技術(shù):Web遠(yuǎn)程過程調(diào)用(以下簡稱WebRPC)。在一些場合下,甚至成為不可替代的實現(xiàn)方式。WebRPC的實現(xiàn)方式經(jīng)歷了從普通URL讀取,隱藏幀,IFrame,XMLHTTP乃至Flash等。
以前傳統(tǒng)的遠(yuǎn)程調(diào)用技術(shù)會帶來頁面刷新問題,頁面刷新的時候會重新向服務(wù)器提交請求,服務(wù)器經(jīng)過運算后返回運算結(jié)果,客戶端得到運算結(jié)果并重新繪制整個頁面。如圖1所示,在此過程中會帶來以下問題:首先,用戶提交請求只是改變頁面上某個區(qū)域的數(shù)據(jù),而客戶端服務(wù)器卻會向遠(yuǎn)程服務(wù)器遞交整個頁面的刷新請求,這樣在遠(yuǎn)程服務(wù)器上就會對整個頁面的所有數(shù)據(jù)進(jìn)行運算;其次,遠(yuǎn)程服務(wù)器返回客戶端服務(wù)器以及客戶端服務(wù)器返回用戶的數(shù)據(jù)是整個頁面,這樣會暫用大量互聯(lián)網(wǎng)帶寬;最后,還要耗費客戶端資源來重繪頁面。
圖2是無刷新技術(shù),該技術(shù)只需要在遠(yuǎn)程服務(wù)器上運算需要改變的那段數(shù)據(jù),在互聯(lián)網(wǎng)上傳輸改變的數(shù)據(jù),客戶端上也只繪制改變的內(nèi)容,這樣對服務(wù)器,對互聯(lián)網(wǎng)和對客戶端而言都節(jié)約了大量資源,并且由于改變的數(shù)據(jù)只是頁面上一小部分,所以對各方面而言運算出錯的幾率也大大降低。圖2和圖1最大的不同出現(xiàn)在步驟2、步驟3和步驟4。
圖1 傳統(tǒng)遠(yuǎn)程過程調(diào)用技術(shù)
圖2 無刷新遠(yuǎn)程過程調(diào)用技術(shù)
WebRPC的實現(xiàn)方式經(jīng)歷了從普通URL讀取,隱藏幀,IFrame,XMLHTTP乃至 Flash等,技術(shù)發(fā)展也越來越成熟。下面對幾種WebRPC技術(shù)分別作介紹,比較它們之間的優(yōu)缺點[1]。
MSRS通過一個applet類以及頁面上的參數(shù)配置與服務(wù)器端交互,從而實現(xiàn)了遠(yuǎn)程調(diào)用。采用此項技術(shù)實際上將頁面不刷新的工作交給了一個名為rsproxy.class的不可見Applet完成。此方法的優(yōu)點:輕而易舉跨瀏覽器,缺點:由于服務(wù)器端采用微軟asp導(dǎo)致applet加載緩慢。此方法不支持?jǐn)?shù)據(jù)類型序列化/反序列化,同時支持異步/同步方式。
JSRS是一種基于Javascript技術(shù)的無刷新遠(yuǎn)程內(nèi)容調(diào)用技術(shù),等同于目前的AJAX技術(shù)。支持兩種遠(yuǎn)程調(diào)用方式:HTTP GET方式(動態(tài)加載JS文件),HTTP POST方式(用JS動態(tài)創(chuàng)建一個Iframe,在其中提交一個表單),支持簡單數(shù)據(jù)的序列化/反序列化。圖3來自BlueShoes網(wǎng)站[3],瀏覽器和Web服務(wù)器之間通過Javascript腳本發(fā)生交互,在Web應(yīng)用程序驗證數(shù)據(jù)有效性的時候,瀏覽器端用戶可以繼續(xù)填寫頁面中其他文本表單。瀏覽器端開發(fā)人員可以創(chuàng)建無縫,交互式Web應(yīng)用程序來調(diào)用Web服務(wù)器的后臺數(shù)據(jù)。
圖3 JSRS運行原理
圖4 DWR運行原理
XML-RPC用XML語言對數(shù)據(jù)進(jìn)行編碼,編碼后的數(shù)據(jù)通過HTTP協(xié)議來供遠(yuǎn)程客戶端調(diào)用。它定義了一種協(xié)議規(guī)范,由于它的輕量級、概念完整,因此目前絕大多數(shù)語言都有實現(xiàn),包括Java(Apache xml-rpc),PHP,javascript,VBScript,python等等。最大的交流方式Blog協(xié)議,管理方法也遵循XML-RPC規(guī)范。優(yōu)點:絕大多數(shù)語言都支持,并且此語言簡單規(guī)范。缺點:Java實現(xiàn)對數(shù)據(jù)類型序列化支持有限。
采用xmlhttp傳遞請求,服務(wù)器端利用反射找到相應(yīng)方法執(zhí)行后將結(jié)果返回。較有創(chuàng)意的是將服務(wù)器端需要進(jìn)行遠(yuǎn)程調(diào)用的代碼動態(tài)轉(zhuǎn)換為相應(yīng)的js代碼,前端可以直接顯式調(diào)用??梢宰鳛閃ebRPC學(xué)習(xí)入門。不支持?jǐn)?shù)據(jù)序列化。圖4來自DWR網(wǎng)站[6],Javascript函數(shù)eventHandler()是客戶端瀏覽器的一個訪問事件,它調(diào)用getOptions()方法,就好像AjaxService是一個Javascript對象一樣。開發(fā)人員可以讓DWR來完成客戶端和服務(wù)器端之間的數(shù)據(jù)通信。
與XML-RPC類似,JSON-RPC也是一個輕量級遠(yuǎn)程調(diào)用協(xié)議。在此協(xié)議之上進(jìn)行數(shù)據(jù)調(diào)用,采用xmlhttp發(fā)送/接受請求,支持完整的數(shù)據(jù)序列化/反序列。目前,jason Web框架采用json-rpc為底層方式。jabsorb(Java to JavaScript Object Request Broker)作為一個輕量級的Ajax/Web 2.0框架,使用JSON-RPC協(xié)議作為數(shù)據(jù)傳輸機制的,通過JavaScript來調(diào)用遠(yuǎn)程服務(wù)器上的Java Web應(yīng)用程序。在遠(yuǎn)程服務(wù)器端封裝或者未封裝的對象和客戶端之間的來回數(shù)據(jù)通信都可以通過jabsorb進(jìn)行處理。JSON完全使用了JavaScript自己的特性完成了數(shù)據(jù)的解析,在獲取遠(yuǎn)程服務(wù)器上數(shù)據(jù)的時候無需刷新整個Web頁面,通過JSON讀取遠(yuǎn)程服務(wù)器數(shù)據(jù)并在頁面局部區(qū)域呈現(xiàn)出來。
Burlap是一個輕量級的機遇XML語言的協(xié)議,多用在移動設(shè)備Java應(yīng)用上,用于連接遠(yuǎn)程Resin服務(wù)器,支持?jǐn)?shù)據(jù)序列化。通過Burlap提供的API發(fā)起數(shù)據(jù)請求,然后基于XML-RPC協(xié)議將請求信息轉(zhuǎn)化為符合協(xié)議的XML格式,轉(zhuǎn)化為流進(jìn)行傳輸,客戶端瀏覽器接收到序列化的流數(shù)據(jù)后再根據(jù)XML-RPC協(xié)議進(jìn)行還原,返回結(jié)果寫入XML中,由Burlap返回至調(diào)用端。
XINS是一個開源的Web服務(wù)框架,支持REST、SOAP、XML-RPC、JSON、JSON-RPC等HTTP協(xié)議。它由兩部分構(gòu)成,一個是基于XML語言的文檔描述格式,另一個是基于Java語言的應(yīng)用程序框架。圖5來自XINS官方網(wǎng)站[9],各種函數(shù)、類型等都由XML書寫,XML和XINS結(jié)合生成客戶端API(.jar)、java服務(wù)器代碼模板(.war)、WSDL文檔描述或者其他開放文檔格式。
圖5 XINS工作原理
圖6 WEBParts構(gòu)成一個完整頁面
遠(yuǎn)程服務(wù)器上基于SOAP協(xié)議的Web服務(wù)常規(guī)下要通過編程來引用,而WebService behavior允許客戶端通過Javascript腳本來調(diào)用。這種客戶端腳本調(diào)用方式為程序員帶來了很大方便,程序員不需要去了解SOAP協(xié)議復(fù)雜的實現(xiàn)機制。這種方式通過一個HTML控件(HTC)文件來實現(xiàn),可用于IE5或以上版本的瀏覽器。除了微軟有一個Webservice.htc控件,mozilla也有相應(yīng)的Webservice訪問方式。因此,在HTML中訪問Webservice也是可行的。WebService behavior采用XML形式在客戶端和服務(wù)器端傳輸數(shù)據(jù),雖然這種數(shù)據(jù)傳輸方式的實時性比基于TCP/IP的Socket技術(shù)要弱,但其方便、簡單、開放的實現(xiàn)方式使其有著較強的競爭優(yōu)勢。
作為無刷新遠(yuǎn)程內(nèi)容調(diào)用技術(shù)的后起之秀,Web JS實現(xiàn)起來更為方便,且首次引入了WebPart的概念。本技術(shù)把網(wǎng)頁頁面看做是由多個小區(qū)域構(gòu)成,這些小區(qū)域稱之為WebPart。如圖6所示,每個紅色矩形框起來的區(qū)域就是一個WebPart,每個WebPart的內(nèi)容都是調(diào)用遠(yuǎn)程服務(wù)器上的內(nèi)容,多個WebPart一起構(gòu)成一個完整的頁面,如果需要對頁面中的某個數(shù)據(jù)進(jìn)行更改,只需要更改該WebPart對應(yīng)的遠(yuǎn)程服務(wù)器上的內(nèi)容即可,本技術(shù)支持序列化。
無刷新Web遠(yuǎn)程過程調(diào)用技術(shù)是目前的研究熱點,其最大的優(yōu)點,可以在不刷新頁面的情況下調(diào)用服務(wù)端的數(shù)據(jù)。這種技術(shù)使用簡單,即使是缺乏專業(yè)編程技術(shù)的網(wǎng)站管理員也可以很方便的調(diào)用遠(yuǎn)程服務(wù)器上的數(shù)據(jù),實現(xiàn)本地網(wǎng)站動態(tài)內(nèi)容加載的功能。在此對本研究領(lǐng)域的集中常見技術(shù)進(jìn)行了對比,有利于研究者對本研究領(lǐng)域全面的了解,方便進(jìn)行更深入的研究。
[1]WEB(Javascript)遠(yuǎn)程調(diào)用方案清單.mechiland的專欄[EB/OL].http:∥blog.csdn.net/mechiland/archive/2005/02/28/305740.aspx,[2005-02-08]
[2]MSRS.微軟官方網(wǎng)站[EB/OL].2005-07.http:∥msdn.microsoft.com/library/default.asp?url=/library/en-us/rmscpt/Html/rmscpt1.asp,2005-07
[3]JSRS.BlueShoes官方網(wǎng)站[EB/OL].http:∥www.blueshoes.org/en/javascript/jsrs/
[4]SURU D,PIERRE W,MITRA W.Utilizing XML-RPC or SOAP on an Embedded System[M].Proceedings of the 24th International Conference on Distributed Computing Systems Workshops-W7:EC(ICDCSW'04).Mar.2004
[5]SAMI S.DWR Java AJAX Applications[M].Packt Publishing,2008
[6]DWR官方網(wǎng)站.http:∥directwebremoting.org/dwr/overview/dwr/
[7]王魁生,王曉波.利用JSON進(jìn)行網(wǎng)站客戶端與服務(wù)器數(shù)據(jù)交互[J].軟件導(dǎo)刊,2010(3):147-149
[8]Burlap.Caucho Technology,Inc[EB/OL].http:∥www.caucho.com/resin-3.1/doc/burlap.xtp
[9]XINS.XINS官方網(wǎng)站[EB/OL].http:∥xins.sourceforge.net/index.html
[10]楊啟亮,崇大平,刑建春,等.WebService Behavior技術(shù)及其應(yīng)用研究[J].計算機應(yīng)用與軟件,2008(2):146-149