JavaRESTfulWebService實戰(第2版)1.2 解讀REST服務

華章計算機發表於2017-05-02

1.2 解讀REST服務

RESTful對應的中文是REST式的,RESTful
Web Service的準確翻譯應該是REST式的Web服務,我們通常簡稱為REST服務。RESTful的應用或者Web服務是最常見的兩種REST式的專案部署、存在的方式。本節將介紹REST服務並對比其與傳統Web Services的不同。

1.2.1 REST式的Web服務

RESTful Web Service是一種遵守REST式風格的Web服務。REST服務是一種ROA(Resource-Oriented
Architecture,面向資源的架構)應用。其主要特點是方法資訊存在於HTTP協議的方法中(比如GET、PUT),作用域存在於URI中。例如,在一個獲取裝置資源列表的GET請求中,方法資訊是GET,作用域資訊是URI中包含的對裝置資源的過濾、分頁和排序等條件。

1.2.2 對比RPC風格

相比Web服務領域廣為流行的RPC(Remote Procedure Call Protocol,遠端過程呼叫協議)風格,REST風格更輕量和快速。從方法資訊角度看,REST採用標準的HTTP方法,而RPC請求都是HTTP協議的POST方法,其方法資訊包含於SOAP協議包或HTTP協議包中,方法名稱不具有通用性。從作用域角度看,REST採用URI顯式定義作用域,而RPC的這一資訊同樣包含於協議包中,不能直觀呈現。

RPC風格的開發關注於伺服器–客戶端之間的方法呼叫,而不關注基於哪個網路層的哪種協議。也就是說,RPC是面向方法呼叫過程的,相比而言,REST是面向資源狀態的。RPC風格的兩個代表是XML-RPC和大Web服務。

1. XML-RPC

XML-RPC是一種使用XML格式封裝方法呼叫,並使用HTTP協議作為傳送機制的RPC風格的實現。XML-RPC的請求方法都是HTTP協議的POST方法,請求和響應的資料格式均為XML。

XML-RPC的資料格式和使用XML作為資源的表述的REST外觀上很相似,但資料的內容則大相徑庭。REST式的XML資訊的主體是對一個資源狀態的表述,無須包含方法資訊,因為其請求的HTTP方法就已經決定了這一點。XML-RPC的請求資料結構額外包含方法呼叫資訊和引數資訊。

對於響應資訊的內容兩者也截然不同,REST式通常會包含響應實體資訊,以及HTTP狀態碼和可選的異常資訊,而XML-RPC的返回資訊僅僅是對方法呼叫的響應資訊。

XML-RPC是一種遺留技術,已經被SOAP取代。在Java領域,JAX-RPC標準已經併入JAX-WS2標準。XML-RPC的應用依然存在,著名的測試用例管理系統TestLink的對外介面就是使用PHP開發的XML-RPC。

2. 大Web服務

大Web服務(Big Web Service)是Leonard Richardson和Sam Ruby在其所著的《RESTful Web Services》一書中,對基於SOAP+ WSDL+UDDI+WS-標準棧等技術實現RPC風格的大型Web服務的統稱。事實上,“大Web服務”這一說法也被Java EE 7的佈道者們在多次演講中使用。在Java領域,對應的標準主要是JAX-WS 2.0/2.1/2.2(JSR 224)。相較REST式的Web服務,大Web服務功能更強大,設計更復雜。大Web服務同樣是跨平臺、跨語言的,對複雜的資料型別的支援也非常好。大Web服務是基於RPC風格的重量設計,因此方法和作用域無法通過直觀斷定,需要定義在訊息中,而且方法名不是統一和通用的。同時,大Web服務走HTTP協議時,請求都是基於POST方法的。

對比RPC風格的Web服務,REST式的Web服務形式更簡單、設計更輕量、實現更快捷。REST無須引入SOAP訊息傳輸層,無須註冊服務,也沒有客戶端stub的概念等。但是,REST式的Web服務並沒有像大Web服務那樣提供諸如安全策略等全面的標準規範。

大Web服務和REST式的Web服務各有優勢,並不是一種替換關係。在實際開發中,兩者共存於一個專案中也是一種解決方案。

1.2.3 對比MVC風格

MVC風格的出現將模型、檢視、控制解耦,其亮點是從前到後的一致性,其結構整潔、邏輯清晰,易於擴充套件和增強。MVC在Java領域的普遍實現方式是在Web前端使用標籤庫來對應服務端的模型類例項和控制類例項,標籤庫和服務端依賴庫可以是鬆散的耦合,比如Spring生態系統,也可以是全棧式的統一體系,比如JSF體系。但無論如何實現,在Web前端的開發過程中,必須時刻考慮頁面標籤和服務端的對映關係,包括模型類的匹配和轉換、資料結構、控制類的輸入和輸出的引數型別和數量等。

因此,MVC風格偏重於解決伺服器端的邏輯分層問題,以及客戶端是邏輯分層的延伸問題。MVC的標籤庫雖然其形態已經和HTML頁面融合,但本質上還是Java編寫的裝飾模式的類例項,對應的是伺服器端使用Java編寫的模型類或者控制器類,因此MVC很難實現跨語言解耦。而REST風格偏重於統一介面,因此具體實現就可以跨平臺和跨語言。REST推動了Web開發的新時代,使用平庸的純HTML作為客戶端,沒有伺服器端和客戶端的耦合。顯而易見,使用純HTML開發的REST客戶端和使用Java開發的REST伺服器端並不存在語言上的耦合。

MVC和REST式並不是互斥的,如Spring的MVC模組已經開始支援REST式的開發。Jersey作為JAX-RS標準的實現,也實現了MVC的功能,請參考相關模組:jersey-mvc、jersey-mvc-freemarker和jersey-mvc-jsp。需要說明的是,本書致力於講述JAX-RS,對於Jersey實現中的JAX-RS之外的功能,只做必要的講述。由於MVC和REST之間有更多的並行存在性,本書余文沒有將MVC放入講述之列。


相關文章