
一、概述
Representational State Transfer (REST) is a software architecture style consisting of guidelines and best practices for creating scalable web services. REST is a coordinated set of constraints applied to the design of components in a distributed hypermedia system that can lead to a more performant and maintainable architecture.
REST是一種軟件架構風格,是創建可擴展web服務的指南和最佳實踐。在分布式系統中提出一系列約束和規范,以創建高性能和可維護的架構。如果一個架構符合REST原則,就可以稱它為RESTful架構。
二、概念
1、資源
所謂資源,就是網絡上的一個實體,可以是一段文本、一張圖片、一種服務等具體的存在。用URI(統一資源標識符)來指向資源,每種資源對應一個特定的URI。要想獲取資源,訪問該資源的URI即可。
2、表現層
網絡實體(資源)可以有多種表現形式,其具體表現出來的形式,稱為它的表現層。比如文本可以用txt格式表現,也可以使用HTML格式、XML格式、JSON格式表現。圖片可以用JPG格式表現,也可以使用PNG格式表現。URI只代表資源的位置,它的表現形式應該在請求的頭信息中指定。
3、狀態轉換
當客戶端與服務器之間進行互動時,會涉及到數據和狀態的變化。由于HTTP協議是一個無狀態協議,客戶端需要通過HTTP動作使服務器端發生狀態轉化。
三、約束
要想構建RESTful的架構,有以下幾個約束:
- 使用客戶端/服務器模型。
- 使用層次化的系統。
- 無狀態。客戶端在每次發送請求時都需要提供足夠的信息。
- 可緩存。能夠緩存請求,以盡量減少客戶端和服務器之間的信息傳輸。
- 統一的接口。使用統一的接口來完成用戶與服務之間以及各子系統之間的交互。
關于接口,有以下幾個原則:
- 每個資源都擁有一個資源標識。
- 消息的自描述性。所傳遞的消息需要能夠提供自身的足夠信息。
- 資源的自描述性。所返回的資源需要能夠描述自身,并提供足夠的用于操作該資源的信息。
- HATEOAS。只可以通過服務端所返回各結果中所包含的信息來得到下一步操作所需要的信息。
四、設計原則
1、資源識別
REST中的API是以資源為中心,而不是以執行的動作為中心。通常所執行動作的對象被看成是系統中的資源。如果一個動作沒有明確的操作對象,就需要考慮該動作產生了哪些影響或哪些狀態發生了改變,發生變化的實體就是資源。
在抽象出資源的過程中,按照自頂向下的方式,首先識別出主要資源,然后識別主要資源的子資源,依次迭代。
判斷一個資源定義是否合理,有以下幾種方法:
- 對資源的CRUD是否有意義。
- 是否需要除CRUD之外的操作。
- 資源是否被整體使用。
2、資源的URL
當標識出一個資源之后,需要為資源分配對應的URL。一個URL主要由幾部分組成:
- 協議,即HTTP或HTTPS。
- 域名,盡量將API部署在專有域名下。如果API很簡單,不會進一步擴展,也可以放在主域名下。
- 相對路徑,每個網址代表一種資源,所以只使用名詞,而不使用動詞。所用的名詞通常與數據庫對應,并且數據庫通常都是記錄的集合,所以API中的名詞應該使用復數形式。如果API版本更迭,應該將API的版本號也放到URL中。
- 請求參數,即由“?”開始,并由“&”連接的多個鍵值對組成的字符串。
對于返回的記錄數量很多的場合,API應該提供參數,過濾返回結果:
- ?Limit=10,指定返回記錄的數量。
- ?offset=10,指定返回記錄的開始位置。
- ?page=2&per_page=100,指定第幾頁,以及每頁的記錄數。
- ?sortby=name&order=asc,指定返回結果按照哪個屬性排序,以及排序的升降順序。
- ?type_id=1,指定過濾條件。
3、使用合適的動詞
對資源的具體操作類型,由HTTP動詞表示。
- GET(SELECT),從服務器獲取資源。
- POST(CREATE),在服務器創建一個資源。
- PUT(UPDATE),更新服務器上的資源(客戶端提供更新后的完整資源)。
- PATCH(UPDATE),更新服務器上的資源(客戶端提供更新的屬性)。
- DELETE(DELETE),刪除服務器上的資源。
- HEAD,獲取資源的元數據。
- OPTIONS,獲取關于資源的哪些屬性是可以改變的信息。
()內表示與動詞等價的數據庫操作。
4、使用標準的狀態碼
服務器向客戶端返回的狀態碼和提示信息,具體可參見HTTP響應碼。如果狀態碼是4xx,就應該向客戶端返回出錯信息。通常返回的信息中將error作為鍵名,出錯信息作為鍵值。
5、選擇適當的表示結構
服務器返回的數據格式,應該盡量使用JSON,避免使用XML。