JavaRESTfulWebService實戰(第2版)1.2 解讀REST服務
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放入講述之列。
相關文章
- dubbox rest服務REST
- 使用SpringBoot構建REST服務-什麼是REST服務Spring BootREST
- 微服務架構專案實戰:Spring Boot 如何建立簡單的 REST 服務微服務架構Spring BootREST
- JEESZ REST 服務介面文件REST
- 讓 gRPC 提供 REST 服務RPCREST
- Istio 1.2服務網格釋出
- Laravel —— 服務注入實戰案例Laravel
- 使用ASP.NET Web Api構建基於REST風格的服務實戰系列教程ASP.NETWebAPIREST
- Flask框架搭建REST-API服務Flask框架RESTAPI
- REST服務安全-雙向認證REST
- shell——一鍵部署服務實戰
- REST實戰討論組FAQREST
- java練習-任務1.2-對戰遊戲Java遊戲
- Vue2服務端渲染實踐以及相關解讀Vue服務端
- grpc實戰——服務端流式呼叫RPC服務端
- Angular5 服務端渲染實戰Angular服務端
- 《Hadoop實戰》封面解讀Hadoop
- 使用多執行緒提高rest服務效能執行緒REST
- go-zero 微服務實戰系列(二、服務拆分)Go微服務
- 機器學習web服務化實戰:一次吐血的服務化之路機器學習Web
- Laravel核心解讀–服務提供器(ServiceProvider)LaravelIDE
- RESTful API開發實戰 使用REST JSON XML和JAX-RS構建微服務 大資料和Web服務應用RESTAPIJSONXML微服務大資料Web
- Dapr + .NET Core實戰(八)服務監測
- 微服務實戰:服務發現的可行方案以及實踐案例微服務
- 使用ASP.NET web API建立REST服務(二)ASP.NETWebAPIREST
- Spring Cloud(三) 服務提供者 Eureka + 服務消費者(rest + Ribbon)SpringCloudREST
- Intel CET緩解機制實戰解讀Intel
- 《區塊鏈資訊服務管理規定》解讀區塊鏈
- 產品解讀 | 資料服務平臺:KDP
- 《Linux嵌入式實時應用開發實戰(原書第3版)》——1.2 什麼是實時Linux
- Next.js 服務端渲染框架實戰JS服務端框架
- Spring Cloud 實戰一:服務註冊中心SpringCloud
- ①SpringCloud 實戰:引入Eureka元件,完善服務治理SpringGCCloud元件
- 服務端指南 | HTTPS 專案實戰指南服務端HTTP
- 實戰CXF呼叫Webxml天氣預報服務WebXML
- 鴻蒙開發實戰:【系統服務框架部件】鴻蒙框架
- 《微服務架構設計模式》讀書筆記 | 第2章 服務的拆分策略微服務架構設計模式筆記
- MySQL菜鳥實錄(一):MySQL服務安裝實戰MySql