定義個一個 RESTful 系統的時候應該遵循 6 個約束。
它們限制了服務端只能遵循這些約束來處理和響應客戶端請求,但是遵循這些約束服務也可以獲取理想的非函式化的屬性,例如效能、可伸縮、簡單程度、可變能力、可見度、靈活性、可信度。
如果任何一個服務違背了其中一個原則,將不能被稱作 RESTful 系統。
標準的 REST 約束如下:
客戶端-伺服器
參考內容:客戶端-伺服器模型
第一個約束是基於客戶端-伺服器架構背後的原則——關注點分離。通過分離使用者介面和資料儲存這兩個關注點,提高了使用者介面跨平臺的可能性,通過簡化伺服器元件提高了其可伸縮性。這種分離對於Web來說更加重要的意義是,它使得元件能夠進行獨立修改和擴充套件,從而能夠支援大量組織的網路化需求。
無狀態
參考內容:無狀態協議
客戶端-伺服器通訊的一個制約條件就是服務端無法儲存客戶端的上下文執行環境。從任何客戶端發出的每個請求都包含了服務端所必要的資訊,但是會話狀態仍留在客戶端。
然而在服務端會話狀態可以輕鬆實現跨服務呼叫,例如利用資料庫做持久化來儲存一段時間內的身份認證資訊。客戶端開始傳送請求時,它已準備好過渡到一個新的狀態。當一個或多個請求正在傳送時,客戶端處於過渡狀態。每個應用程式狀態的表示包含可在下一次客戶端選擇發起一個新的狀態過渡使用的連結。
可快取
參考內容:網頁快取
網際網路中的客戶端和中間層伺服器可以快取響應。因此響應必須直接或間接定義自身是否可被快取,以免客戶端使用過期的響應資料來傳送其它請求。良好的快取策略可以有效減少客戶端-伺服器之間的互動,從而進一步提高系統的可伸縮性和效能。
分層系統
參考內容:分層系統
客戶端通常無法判斷它是否是直接連線到後端伺服器,還是中間伺服器。中間伺服器可通過啟用負載平衡,並通過提供共享快取記憶體來提高系統的可擴充套件性。當然也可以強制執行安全政策。
按需程式碼(可選)
參考內容:客戶端指令碼
服務端可以通過傳遞可執行程式碼臨時為客戶端擴充套件或自定義功能。這方面的例子包括可編譯的元件如Java applets和客戶機端指令碼如JavaScript。
統一的介面
統一介面約束是設計任何REST服務的基礎。它簡化和解耦的架構,使得每個部分可以獨立被修改。這個統一的介面包含了四個約束:
資源的標識
各種資源都在請求中被確定,例如在使用URI的Web REST系統中,資源本身就表明它們想要被返回給客戶端的格式。例如服務端可以從它的資料庫傳送HTML,XML或JSON格式的資料,即使這些都不是服務端的內部資料格式。
通過表述來操作資源
當一個客戶端持有一種資源的表述時,包括任何關聯的後設資料,它都有足夠的資訊來修改或刪除該資源。
自描述的訊息
每條資訊都包含足夠的資訊來描述如何處理訊息本身。例如,一個網路媒體型別本身就定義了能執行該媒體的解析器(以前被稱為MIME型別)。
超媒體作為應用程式狀態的引擎(HATEOAS)
已經初始化URI的REST客戶端應用,應該就像人們訪問了一個Web網站主頁一樣,能夠使用伺服器提供的動態連結,請求它所需的資源和進行所需的操作。
處理客戶端訪問時,服務端將響應內容也包括當前可用的其它行為的超連結。沒有必要對REST服務的結構或動態資訊進行硬編碼來響應客戶端客戶端。
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!
任選一種支付方式