Restful是一種軟體架構風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和伺服器互動類的軟體。基於這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取等機制。如果一個架構符合REST原則,就稱它為RESTful架構,可以理解為:
-
每一個URI代表一種資源;
-
客戶端和伺服器之間,傳遞這種資源的某種表現層;
-
客戶端透過四個HTTP動詞,對伺服器端資源進行操作,實現”表現層狀態轉化”。
REST(Representational State Transfer),表現層狀態轉化,指一組架構約束條件和原則。滿足這些約束條件和原則的應用程式或設計就是RESTful。
表現層(Representation): “資源”是一種資訊物體,它可以有多種外在表現形式。我們把”資源”具體呈現出來的形式,叫做它的”表現層”(Representation)。
比如,文字可以用txt格式表現,也可以用HTML格式等表現。URI只代表資源的物體,不代表它的形式。它代表”資源”的位置,它的具體表現形式,是在HTTP請求的頭資訊中用Accept和Content-Type欄位指定,這兩個欄位才是對”表現層”的描述。
狀態轉化(StateTransfer): 訪問一個網站,就代表了客戶端和伺服器的一個互動過程。在這個過程中,勢必涉及到資料和狀態的變化。網際網路通訊協議HTTP協議,是一個無狀態協議。這意味著,所有的狀態都儲存在伺服器端。
因此,如果客戶端想要操作伺服器,必須透過某種手段,讓伺服器端發生”狀態轉化”(StateTransfer)。而這種轉化是建立在表現層之上的,所以就是”表現層狀態轉化”。
客戶端用到的手段,只能是HTTP協議。具體來說,就是HTTP協議裡面,四個表示操作方式的動詞,它們分別對應四種基本操作:
-
GET: GET用來獲取資源
-
POST: POST用來新建資源(也可以用於更新資源)
-
PUT: PUT用來更新資源
-
DELETE: DELETE用來刪除資源。
URI(Uniform Resource Identifier): 是指一個用於標識某一網際網路資源名稱的字串。該種標識允許使用者對任何(包括本地和網際網路)的資源透過特定的協議進行互動操作。URI由包括確定語法和相關協議的方案所定義。Web上可用的每種資源:HTML檔案、影象、影片片段、程式等由一個通用資源識別符號(Uniform Resource Identifier, 簡稱”URI”)進行定位。
統一介面: REST要求,必須透過統一的介面來對資源執行各種操作。對於每個資源只能執行一組有限的操作。以HTTP/1.1協議為例,HTTP/1.1協議定義了一個操作資源的統一介面,主要包括7個HTTP方法: GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS。
-
GET(select):從伺服器取出資源(一項或多項)。
-
POST(create):在伺服器新建一個資源。
-
PUT(update):在伺服器更新資源(客戶端提供改變後的完整資源)。
-
PATCH(update):在伺服器更新資源(客戶端提供改變的屬性)。
-
DELETE(delete):從伺服器刪除資源。
-
HEAD:獲取資源的元資料。
-
OPTIONS:獲取資訊,關於資源的哪些屬性是客戶端可以改變的。
Web應用程式最重要的REST原則是,客戶端和伺服器之間的互動在請求之間是無狀態的。
按照HTTP規範定義,使用標準方法進行資源的操作,比如GET、PUT、POST和DELETE。在伺服器端,應用程式狀態和功能可以分為各種資源。資源是一種概念物體,它向客戶端公開。資源的例子有: 應用程式物件、資料庫記錄、演演算法等等。每個資源都使用URI得到一個唯一的地址。所有資源都共享統一的介面,以便在客戶端和伺服器之間傳輸狀態。
另一個重要的REST原則是分層系統,這表示元件無法瞭解它與之互動的中間層以外的元件。透過將系統知識限制在單個層,可以限制整個系統的複雜性,促進了底層的獨立性。
當 REST 架構的約束條件作為一個整體應用時,將生成一個可以擴充套件到大量客戶端的應用程式。它還降低了客戶端和伺服器之間的互動延遲。統一介面簡化了整個系統架構,改進了子系統之間互動的可見性。REST簡化了客戶端和伺服器的實現。
1、RESTful的實現: RESTful Web 服務與 RPC 樣式的 Web 服務
RPC樣式的 Web 服務客戶端將一個裝滿資料的信封(包括方法和引數資訊)透過 HTTP 傳送到伺服器。伺服器開啟信封並使用傳入引數執行指定的方法。方法的結果打包到一個信封並作為響應發回客戶端。客戶端收到響應並開啟信封。
每個物件都有自己獨特的方法以及僅公開一個URI的RPC樣式Web服務,URI表示單個端點。它忽略 HTTP 的大部分特性且僅支援POST方法。
RPC風格開發關註於伺服器-客戶端之間的方法呼叫,不關註基於哪個網路層的那種協議,即RPC是面向方法的呼叫過程的。而REST是面向資源狀態的。
RESTful Web 服務是一種遵守REST式風格的Web服務,主要特點是方法資訊存在於HTTP方法中,作用域存在於URI中,例如,在一個獲取裝置資源串列的GET請求中,方法資訊是GET,作用域資訊是URI中的包含的對裝置資源的過濾、分頁、排序等條件。
在 REST 樣式的 Web 服務中,每個資源都有一個地址。資源本身都是方法呼叫的標的,方法串列對所有資源都是一樣的。這些方法都是標準方法,包括HTTP GET、POST、PUT、DELETE,還可能包括HEADER和OPTIONS方法。
2、RESTful的實現:RESTful Web服務的Java框架
有兩個Java 框架可以幫助構建 RESTful Web 服務。erome Louvel和Dave Pawson開發的Restlet。
它實現針對各種 RESTful 系統的資源、表示、聯結器和媒體型別之類的概念,包括 Web 服務。
在 Restlet 框架中,客戶端和伺服器都是元件。元件透過聯結器互相通訊。該框架最重要的類是抽象類Uniform及其具體的子類 Restlet,該類的子類是專用類,比如 Application、Filter、Finder Router和Route。
這些子類能夠一起處理驗證、過濾、安全、資料轉換以及將傳入請求路由到相應資源等操作。Resource 類生成客戶端的表示形式。
3、RESTful的實現:構建RESTful Web服務的多層架構
RESTful Web服務和動態Web應用程式在許多方面都是類似的。有時它們提供相同或非常類似的資料和函式,儘管客戶端的種類不同。與大部分動態 Web 應用程式一樣,RESTful Web 服務可以從多層架構的關註點分離中受益。業務邏輯和資料可以由自動客戶端和 GUI 客戶端共享。
惟一的不同點在於客戶端的本質和中間層的表示層。此外,從資料訪問中分離業務邏輯可實現資料庫獨立性,併為各種型別的資料儲存提供外掛能力。
在瀏瀏覽器中執行且作為 RESTful Web服務消費者執行的Ajax、Flash、JavaFX、GWT、部落格和wiki 等,因為它們都代表使用者以自動化樣式執行。
自動化Web服務客戶端在Web層向Resource Request Handler傳送 HTTP響應。客戶端的無狀態請求在頭部包含方法資訊,每個請求都包含所有必需的資訊,包括 Resource Request Handler 用來處理請求的憑據。
從Web服務客戶端收到請求之後,Resource Request Handler 從業務邏輯層請求服務。
Resource Request Handler確定所有概念性的物體,系統將這些物體作為資源公開,併為每個資源分配一個惟一的URI。但是,概念性的物體在該層是不存在的。
它們存在於業務邏輯層。可以使用 Jersey 或其他框架(比如 Restlet)實現ResourceRequest Handler。
上圖中的 Web 瀏覽器客戶端作為 GUI 的前端,使用表示層中的Browser Request Handler生成的 HTML 提供顯示功能。
Browser Requester Handler可以使用MVC模型(JSF、Struts或Spring都是Java的例子)。它從瀏覽器接受請求,從業務邏輯層請求服務,生成表示並對瀏覽器做出響應,表示供使用者在瀏覽器中顯示使用。
業務規則可以集中到業務邏輯層,該層充當表示層和資料訪問層之間的資料交換的中間層。資料以域物件或值物件的形式提供給表示層。
資料訪問層提供與資料儲存層的互動,可以使用 DAO 設計樣式或者物件-關係對映解決方案(如Hibernate、OJB或iBATIS)實現。作為替代方案,業務層和資料訪問層中的元件可以實現為 EJB 元件,並取得 EJB 容器的支援,該容器可以為元件生命週期提供便利,管理永續性、事務和資源配置。
資料儲存層包括資料庫系統、LDAP 伺服器、檔案系統和企業資訊系統(包括遺留系統、事務處理系統和企業資源規劃系統)。
使用該架構,您可以開始看到 RESTful Web 服務的力量,它可以靈活地成為任何企業資料儲存的統一 API,從而向以使用者為中心的 Web 應用程式公開垂直資料,並自動化批次報告指令碼。
推薦閱讀
關於NVMe over Fabric,NetApp EF570實現有何不同?
溫馨提示:
請搜尋“ICT_Architect”或“掃一掃”二維碼關註公眾號,點選原文連結獲取更多電子書詳情。
求知若渴, 虛心若愚