RESTful API 設計之學習記錄
REST要點(REST是”設計風格”而不是標準。REST通常基於HTTP、URI、XML以及HTML這些現有的廣泛流行的協定和標準。)
- 資源是由URI來指定。
- 對資源的操作包括取得、建立、修改和刪除,這些操作正好對應HTTP協定提供的GET、POST、PUT和DELETE方法。
- 通過操作資源的表現形式來操作資源。
- 資源的表現形式則是XML或者HTML,取決於讀者是機器還是人、是消費Web服務的客戶軟體還是Web瀏覽器。當然也可以是任何其他的格式,例如JSON。
特徵
- 統一介面(Uniform Interface)
- Identification of resources - 唯一的資源識別
- Manipulation of resources - 特定的操作方法
- Self-descriptive messages - 訊息自我描述
- Hypermedia as the engine of application state (HATEOAS)
- Level 0 : 使用一個 URI 與一個 HTTP 方法,基本上就是單純使用 HTTP 作為傳輸協定,服務使用的 URI 只是個接收請求進行回應的端點,HTTP 方法只是用來發起請求,至於請求的相關細節,例如想進行的動作、必須提供的資料等,全部包含在發送過去的文件之中,像是 XML、JSON 等其他(自訂)格式,回應使用某個文件格式傳回,當中包含了請求操作後的結果。
- Level 1 : 使用多個 URI 與一個 HTTP 方法,URI 代表了資源,像是 /show_message、/create_message、/update_message、/delete_message 都是資源,HTTP 方法只是用來發起請求,至於請求的細節由請求本體來提供,例如,在請求 /show_message 這項資源時,若包含 all 請求參數,表示顯示全部的訊息,若是 “id=1” 這類請求參數,表示顯示指定的訊息。
- Level 2 :使用多個 URI、多個 HTTP 方法,並善用 HTTP 回應狀態碼,URI 用來代表資源,像是 /messages、/messages/1,HTTP 方法用來表示想進行的操作,例如 GET /messages 表示取得全部訊息,GET /messages/1 表示取得指定訊息,POST /messages 表示新增訊息、DELETE /messages/1 表示刪除指定訊息等
- Level 3 : 更進一步地,支援 HATEOAS(Hypermedia As The Engine Of Application State)的概念,就類似 HTML 頁面鏈結,你可以從這個頁面得知可通往哪些頁面,在 REST 的 Level 3 模型中,客戶端可以從某個資源,知道還有哪些其他相關的資源,以及如何對它進行操作
- Stateless(無狀態)
1 | #How to understand “RESTful API is stateless”?(stackoverflow) (部分內容擷取) |
- Cacheable(可快取)
- Client-Server(客戶伺服器分離模式,任何一個客戶端與伺服器都是可替換的)
- Layered System (分層的系統,客戶端不知道他請求的是不是最終伺服器)
- Code on Demand (optional)
- 允許客戶端提高其靈活性(視情況決定要不要遵守,Server端 可以傳送可執行的程式碼給 Client端)
REST設計
符合REST設計風格的Web API稱為RESTful API。它從以下三個方面資源進行定義:
- 直觀簡短的資源位址,比如: http://example.com/resources。
- 傳輸的資源:Web服務接受與返回的網際網路媒體類型,比如:JSON,XML,YAML等。
- 對資源的操作:Web服務在該資源上所支援的一系列請求方法(比如:POST,GET,PUT或DELETE)。
RESTful API設計要點
HTTP動詞
- GET(SELECT):請求指定資源,只應用於取得資料。(Filtering, query string)
- POST(CREATE):在服務器新建一個資源。
- PUT(UPDATE):會取代指定資源所酬載請求(request payload)的所有表現。
- PATCH(UPDATE):指定資源的部份修改。
- DELETE(DELETE):從服務器刪除指定資源。
- HEAD:請求與 GET方法相同的回應,但它沒有回應主體(response body)。(應用於HTTP標頭,判別資源是否存在)
- OPTIONS:描述指定資源的溝通方法(communication option)。
- CONNECT: 指定資源標明的伺服器之間,建立隧道(tunnel)。
- TRACE: 指定資源標明的伺服器之間,執行迴路返回測試(loop-back test)。
資源命名與設計:
- 複數名詞命名資源,如 https://api.example.com/v1/users
- 取得特定ID資源(別另外設計單數),如 https://api.example.com/v1/users/1
- 取得特定複數資料查詢利用 query string做額外條件過濾或參數,
(https://api.example.com/v1/users?order="desc"&&limit=10) - URI 應加入 API 的版本號,如https://api.example.com/v1/users
參考:
REST 成熟度模型
成熟度模型-REST的实现步骤
HyperText Transfer Protocol,HTTP (wiki)
How to understand “RESTful API is stateless”?(stackoverflow)
REST Wiki
RESTful API 设计指南 - 阮一峰的网络日志
Hypermedia As The Engine Of Application State(HATEOAS) Spring HATEOAS
Backend社團-紫色石虎-RESTful API淺談
Backend社團-紫色石虎-RESTful淺談 - demo
HTTP (MDN)