REST無狀態的理解

2021-09-01 17:05:16 字數 1705 閱讀 6318

representational state transfer的縮寫。我對這個片語的翻譯是"表現層狀態轉化"。

降低開發的複雜性,提高系統的可伸縮性

資源

rest的名稱"表現層狀態轉化"中,省略了主語。"表現層"其實指的是"資源"(resources)的"表現層"。所謂"資源",就是網路上的乙個實體,或者說是網路上的乙個具體資訊。它可以是一段文字、一張、一首歌曲、一種服務,總之就是乙個具體的實在。你可以用乙個uri(統一資源定位符)指向它,每種資源對應乙個特定的uri。要獲取這個資源,訪問它的uri就可以,因此uri就成了每乙個資源的位址或獨一無二的識別符。

表現層(representation)

uri只代表資源的實體,不代表它的形式。嚴格地說,有些**最後的".html"字尾名是不必要的,因為這個字尾名表示格式,屬於"表現層"範疇,而uri應該只代表"資源"的位置。它的具體表現形式,應該在http請求的頭資訊中用accept和content-type欄位指定,這兩個欄位才是對"表現層"的描述。

狀態轉化(state transfer)

網際網路通訊協議http協議,是乙個無狀態協議。這意味著,所有的狀態都儲存在伺服器端。因此,如果客戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生"狀態轉化"(state transfer)。而這種轉化是建立在表現層之上的,所以就是"表現層狀態轉化"。

就是http協議裡面,四個表示操作方式的動詞:get、post、put、delete。它們分別對應四種基本操作:get用來獲取資源,post用來新建資源(也可以用於更新資源),put用來更新資源,delete用來刪除資源。

幾種誤區

最常見的一種設計錯誤,就是uri包含動詞--》 /posts/show/1,正確的寫法應該是/posts/1,然後用get方法表示show。

資源不能是動詞,但是可以是一種服務

為什麼在請求中傳遞sessionid被普遍認為是unrestful的,而將使用者的credentials包含在每個請求裡又是一種非常restful的做法

無狀態指的是任意乙個web請求必須完全與其他請求隔離,當請求端提出請求時,請求本身包含了相應端為相應這一請求所需的全部資訊。

資源狀態:則反映了某一儲存在伺服器端資源在某一時刻的特定狀態,該狀態不會因為使用者請求而改變,任何使用者在同一時刻對該資源的請求都會獲得這一狀態的表現(representation)。

restful架構要求伺服器端不保有任何與特定http請求相關的資源,所以應用狀態必須由請求方在請求過程中提供。

在session id可以被認為是乙個用來標識某一會話狀態的key,將其傳遞給伺服器端意味著這樣乙個請求:「請幫我取出這個狀態資訊」,也就是說這個請求假設響應方保有著狀態資訊。由於與某一特定請求相關的狀態屬於應用狀態,而restful架構要求任何此類狀態由請求方負責提供,所以傳遞session id被認為是unrestful的做法。反過來,user credential作為一種應用狀態,是被期望由請求方提供的,所以在請求中傳遞user credentials(姑且忽略安全性問題)是符合restful架構規範的。

參考:

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

rest含義為 表述性狀態轉移 基於rest的web服務遵循一些基本的設計原則,比較難理解的是伺服器端的請求應該是無狀態的。rest 含義為 表述性狀態轉移 rest是一種開發 web 應用的架構風格,可以將其理解為一種設計模式。1 通過 uri 來標識資源 系統中的每乙個物件或是資源都可以通過乙個...

restful的無狀態理解

所謂無狀態 就是資源可以通過uri來指定,就像是乙個蘿蔔乙個坑的意思。而且定位與其他資源無關,也不會因為其他資源的變化而變化。有狀態和無狀態的區別,有狀態是指 比如乙個資產應用系統,你想看下報廢的台式電腦有多少,是什麼型號,你得在登入介面登進去,然後點開資產維護功能,檢視報廢的相關資訊,選中台式電腦...

無狀態登入

有狀態服務,即服務端需要記錄每次會話的客戶端資訊,從而識別客戶端身份,根據使用者身份進行請求的處理,典型的設計如tomcat中的session。例如登入 使用者登入後,我們把登入者的資訊儲存在服務端session中,並且給使用者乙個cookie值,記錄對應的session。然後下次請求,使用者攜帶c...