讀Roy Fielding的REST風格架構筆記
REST顧名思義:Representational State Transfer(表述化狀態轉移)。 REST兩個基本概念:
- 資源(Resource):將信息抽象為資源,任何能夠命名的信息(包括數據和功能)都能作為一個資源,一張圖片,一份文檔,一個服務(如上傳圖片),一個其他資源的集合等。 資源是到一組實體的概念上的映射,而不是在特定時刻與該映射相關聯的實體的映射。例如,“最新上傳的圖片”是一個值經常變化的映射,但是“2011/1/9上傳的圖片”的映射是靜態。它們是截然不同的資源,即使某一時刻它們可能會映射到相同值的集合。
- 表述(Representation): 一個資源當前或預期的狀態,資源是一個隨時間變化的函數,該函數將時間t映射到一個實體或值的集合,集合中的值可能是資源的表述。REST組件通過URI來獲得資源的表述并對資源執行動作,并在組件間傳遞該表述。
舉購物網站系統的例子,products通過加入購物車到orders,經過付款訂單到purchase,然后到delivery。其中products和orders是資源,可以通過/products?color=green和/orders/2007/11表示;而purchase和delivery是資源products和orders某一時間的狀態。應用程序如同資源和表述組成的虛擬的狀態機,通過不斷的獲取資源的表述來轉變應用程序的狀態,即所謂的表述化狀態轉移。
REST風格架構的約束:
- 客戶-服務器:分離關注點,將用戶接口(如用戶界面)和數據存儲分離,如果接口不變,組件可獨立進化。
- 無 狀態:從客戶端道服務器的每個請求必須包含理解該請求所必需的所有信息,不能利用任何存儲在服務器上的上下文。提高了系統的可擴展性,其優點有三:可見 性,監視系統不必為了確定一個請求的性質而去查看請求之外的多個請求;可靠性,減輕了從局部故障恢復的任務量,可以快速定位;可伸縮性,不必在多個請求之 間保存狀態,允許服務器快速釋放資源,并且服務器不必跨請求管理資源。缺點是,由于不能將狀態保存在服務器上的共享上下文中,增加了請求中發送的重復數 據,降低網絡性能,因此有了約束三。
- 緩存:請求響應中的數據顯示或隱式的標記為可緩存的不可緩存的。緩存可以為以后相同的請求重用這個響應的數據。但是緩存管理不好,會降低可靠性,導致緩存中陳舊的數據與直接訪問服務器得到的數據差別很大。
- 統一接口:組件之間要有統一的接口,是REST風格架構區別其他風格架構的核心特征。REST由四個接口約束定義:資源的識別,web-based系統中資源由URI表示,數據庫存儲系統中資源還可以是XML,JSON等;通過表述對資源執行的動作:表述中包含操作該資源的信息,如增刪改查,映射到HTTP協議的GET,POST,PUT,DELETE方法;自描述的消息:消息中包含如何處理該消息的信息,如哪個sevlet處理,響應中包含可不可以被緩存等信息;作為應用狀態引擎的超媒體。
- 分層系統:通過限制組件的行為,即每個組件只能看到與其交互的緊鄰層,將架構分解為若干等級層,提高各層的獨立性。
- 按需代碼:客戶端知道如何訪問資源,但是不知道如何處理它,向服務器發送對于如何處理資源的代碼的請求,接收這些代碼,然后在本地執行代碼。