1. 程式人生 > >理論與例項,準確理解REST的無狀態設計

理論與例項,準確理解REST的無狀態設計

REST含義為”表述性狀態轉移”, 基於REST的Web服務遵循一些基本的設計原則, 比較難理解的是伺服器端的請求應該是無狀態的。

簡介:

REST 含義為“表述性狀態轉移”。REST是一種開發 Web 應用的架構風格,可以將其理解為一種設計模式。

設計原則:

1)通過 URI 來標識資源:
系統中的每一個物件或是資源都可以通過一個唯一的 URI 來進行定址,URI 的結構應該簡單、可預測且易於理解,比如定義目錄結構式的 URI。
2)統一介面:
建立建立、檢索、更新和刪除操作與 HTTP 方法之間的一對一對映:
若要在伺服器上建立資源,應該使用 POST 方法;
若要檢索某個資源,應該使用 GET 方法;
若要更新或者新增資源,應該使用 PUT 方法;
若要刪除某個資源,應該使用 DELETE 方法。
3)資源多重表述:
URI 所訪問的每個資源都可以使用不同的形式加以表示(比如 XML 或者 JSON),具體的表現形式取決於訪問資源的客戶端。在 REST 的世界中,資源即狀態,每個網頁是其一個狀態;URI 是狀態的表述;REST 風格的應用則是從一個狀態遷移到下一個狀態的狀態轉移過程。早期網際網路只有靜態頁面的時候,通過超連結在靜態網頁間瀏覽跳轉的 page->link->page->link… 模式就是一種典型的狀態轉移過程。
4)無狀態:
客戶端對伺服器端的請求應該是無狀態的,請求不要求伺服器在處理請求時檢索任何型別的應用程式上下文或狀態。無狀態約束使伺服器的變化對客戶端是不可見的,因為在兩次連續的請求中,客戶端並不依賴於同一臺伺服器。

如何理解REST的無狀態設計

每一個URI請求(例如網頁)理解為一個狀態,那麼不同URI(網頁)間的跳轉可以理解為不同狀態之間的轉移。那麼這個狀態究竟如何實現轉移的呢?
很關鍵的理解:

狀態可以嵌入到應答訊息裡,這樣一來狀態在接下來的互動中仍然有效。
通過超連結實現有狀態互動,請求訊息的每次互動都包含完整的資訊。有多種技術實現了不同請求間狀態資訊的傳輸,例如 URI ,cookies 和隱藏表單欄位等。狀態可以嵌入到應答訊息裡,這樣一來狀態在接下來的互動中仍然有效。

舉例子:
狀態記錄在服務端設計:
a, 使用者user登陸後,user的上下文資訊例如記錄該user已登陸的標識儲存在伺服器端session中,當用戶發生下一次的請求,服務端會根據userId查詢該session是否標記了該使用者已登入的狀態
b, 使用者瀏覽書籤頁,當前使用者瀏覽的頁面是第3頁,這個第3頁的資訊儲存在伺服器端session中,當用戶請求下一頁nextPage,服務端從session拿出當前閱讀狀態為第3頁,基於此狀態計算出下一頁是第4頁

RESTful的設計:
a, 使用者user登陸後,伺服器生成驗證資訊token,該token標記該使用者已經登陸的狀態,服務端不儲存該token資訊,而是token返回給客戶端,
當用戶發生下一次的請求,客戶端把該token重新發送給服務端,於是服務端就根據該token知道使用者已經登陸的狀態(具體實現是:第一次登陸,token資訊在資料庫端快取下來,第二次請求時候從資料庫快取查詢該使用者token。這樣使用者狀態的資訊就不需要儲存在伺服器端,儲存了在資料庫端,資料庫端一般採用redis型別的快取資料庫)
b, 使用者瀏覽書籤頁,當前使用者瀏覽的頁面是第3頁,伺服器返回當前頁第3頁這個狀態給客戶端,服務端不儲存當前閱讀頁數的狀態,當用戶發生下一頁的請求,客戶端把當前頁第3頁和下一頁操作給服務端,服務端基於客戶端的狀態資訊計算出下一頁是第4頁

由此可以看出,
REST 風格應用可以實現互動,但它卻天然地具有伺服器無狀態的特徵。在狀態遷移的過程中,伺服器不需要記錄任何 Session,所有的狀態都通過 URI 的形式記錄在了客戶端。更準確地說,這裡的無狀態伺服器,是指伺服器不儲存會話狀態(Session);而資源本身則是天然的狀態,通常是需要被儲存的;這裡所指無狀態伺服器均指無會話狀態伺服器。

補充一點:
REST表述性狀態轉移,個人認為可以簡單理解為把服務端的狀態遷移到客戶端儲存或者資料庫端儲存,從而應用伺服器就可以設計成無狀態。所以文章標題更嚴格來說應該是“準確理解REST在應用服務端的無狀態設計”。

學習過程分享:

學習新技術,大致分兩個階段:

第一階段:瞭解這個東西是什麼,有什麼功能,什麼場景下使用

基於這個層次的理解,我們一般就可以進入應用階段,所謂依葫蘆畫瓢。

第二階段:這個東西為什麼是這樣的,功能原理是怎樣的,如何實現,如何做到

基於這個層次的深入思考,就能對比出不同技術方案之間的區別,真正體會這門技術的要點。

如果永遠停留在第一個層次,那你永遠是技術的被動者,很難成為大師。現今浮躁社會的速成方法往往讓開發工程師停留在第一階段。

網上查了很多部落格介紹REST或者RESTFUL,基本沒有很滿意的文章,感覺大部分都是抄襲,沒有自己的理解。因為我看到的大部分是抄襲理論介紹,抄襲本無錯,關鍵是經常缺少基於自己理解的例子。

REST和RESTFUL的區別,關係?

經過大量資料閱讀,我只能這樣舉例解釋:就好比Beauty和Beautiful的關係。