概念
本質:一種軟體架構風格,通過 REST 可以實作系統的高性能、可伸縮、通用性、簡單性、可修改性和可擴充等特性。
核心:面向資源設計的API
解決問題:
- 降低開發的複雜性
- 提高系統的可伸縮性
例如:設計一套API,為多個終端服務。
設計概念和準則
- 網絡上的所有事物都可以被抽象為資源
- 每一個資源都有唯一的資源辨別,對資源的操作不會改變這些辨別
- 所有的操作都是無狀态的(本次操作、下次操作、上次操作之間無關系)
資源:網絡上的一個實體、具體資訊。
設計RESTful API
資源路徑(URI):RESTful的核心是面向資源,如何規劃資源路徑很重要
HTTP動詞(請求方式):如get,post,delete,put
過濾資訊:例如擷取資源清單時有分頁操作/查詢操作,這時要合理配置設定過濾資訊,過濾資訊設定太多,有可能會違反RESTful API 關于URI方面的限定。
狀态碼:當用戶端發送一個請求時,服務端應當響應什麼狀态碼
錯誤處理:如當發現用戶端傳入的參數有問題時,該傳回什麼樣的狀态資訊。
傳回結果:如POST資源的時候,需要傳回一個資源執行個體;GET資源清單時,需要傳回一個資源數組;
資源路徑
在RESTful架構中,每個網址代表一個資源,是以網址中不能有動詞,隻能有名詞。一般而言,API中的名詞應該使用複數。例如,使用users反映使用者資源的URI,而不是使用user。
URL結尾不應該包含斜杠“/”,這是作為URL路徑中進行中最重要的規則之一,正斜杠(/)不會增加語義值,且可能導緻混淆。REST API不允許一個尾部的斜杠,不應該将它們包含在提供給用戶端的連結的結尾處。rul的路徑中的正斜杠“/“字元用于訓示資源之間的層次關系。
例如:有一個API提供動物園(zoo)的資訊,還包括各種動物和雇員的資訊,那麼它的資源路徑應設計成如下樣子。
https://api.example.com/v1/zoos //動物園資源。使用https協定頭;加入v1版本号,因為以後可能會更改api。版本号的加入有兩種做法,一種是加入到位址中,另一種是加入到HTTP請求頭中;zoos複數
https://api.example.com/v1/animals //動物資源
https://api.example.com/v1/employees //雇員資源
HTTP動詞
對資源的操作有建立、讀取、更新、删除(CURD),由HTTP動詞表示。
GET : 從伺服器去擷取資源
POST :在伺服器建立一個資源
PUT:在伺服器更新資源(用戶端提供改變後的完整資源,服務端傳回完整的更新字段)
PATCH:在伺服器更新資源(用戶端提供改變的屬性,服務端傳回隻發生了更新的字段)
DELETE:從伺服器删除資源
例如:
POST/zoos : 建立一個動物園
GET/zoos/ID : 擷取某個指定動物園的資訊
PUT/zoos/ID : 更新某個指定動物園的資訊
DELETE/zoos/ID : 删除某個動物園
過濾資訊
如果記錄數量過多,伺服器不可能都将它們傳回給使用者。這時就需要進行篩選。篩選時,API應該提供一個參數,過濾一下傳回的結果。
例如:
?offset = 10 :指定傳回記錄的開始位置
?page = 2&per_page = 100 :指定第幾頁,以及每頁的記錄數
?sortby = name&order = asc :指定傳回結果排序,以及排序順序
?animal_type_id = 1 :指定篩選條件
狀态碼
伺服器向使用者傳回的狀态碼和提示資訊,使用标準的HTTP狀态碼
200 OK 伺服器成功傳回使用者請求的資料
201 CREATED 建立或修改資料成功
204 NO CONTENT 删除資料成功
400 BAD REQUEST 使用者發出的請求有錯誤
401 Unauthorized 表示使用者沒有認證,無法進行目前操作
403 Forbidden 表示使用者的通路是被禁止的
422 Unprocesable Entity 當建立一個對象時,發生一個驗證錯誤。例如建立使用者資源時需要使用者名、密碼,而前端隻提供使用者名字段,那麼就要傳回一個422 狀态碼,并傳回錯誤資訊:”密碼不能為空“
500 INTERNAL SERVER ERROR 伺服器内部錯誤,此時服務端無法處理任何請求。
錯誤處理
如果狀态碼是4xx或5xx,就應該向使用者傳回出錯資訊。一般而言,傳回的資訊中将error作為鍵名,出錯資訊作為鍵值即可,例如:
{
"error":"參數錯誤"
}
傳回結果
針對不同操作(如GET,POST),伺服器向使用者傳回的結果應該符合以下規範:
GET/collections: 傳回資源對象的清單(數組)
GET/collections/identity : 讀取資源時,傳入辨別符(identity),服務端傳回辨別符指定的單個資源對象
POST/collections : 傳回新生成的資源對象
PUT/collections/identity : 傳回完整的資源對象
PATCH/collections/identity : 傳回被修改的屬性
DELETE/collections/identity : 傳回一個204狀态碼和空響應體
綜述
綜合上面的解釋,我們總結一下什麼是RESTful架構:
(1)每一個URI代表一種資源;
(2)用戶端和伺服器之間,傳遞這種資源的某種表現層;
(3)用戶端通過四個HTTP動詞,對伺服器端資源進行操作,實作"表現層狀态轉化"。