RESTFul介面和HTTP的冪等性分析
- REST全稱是Representational State Transfer,中文為表述性狀態轉移,REST指的是一組架構約束條件和原則
- RESTful表述的是資源的狀態性轉移,在Web中資源就是URI(Uniform Resource Identifier)(統一資源識別符號)
- 如果一個架構符合REST的約束條件和原則,我們就稱它為RESTful架構,HTTP是目前與REST相關的唯一例項
RESTful介面URL命名原則
- HTTP方法後跟的URL必須是名詞且統一成名詞複數形式
- URL中不採用大小寫混合的駝峰命名,儘量採用全小寫單詞,如果需要連線多個單詞,則採用“-”連線
- 示例:/users、/users-fans;反例:/getUsers、/getUsersFans
HTTP方法的語義
RESTful架構應該遵循統一的介面原則,應該使用標準的HTTP方法如GET和POST,並且遵循這些方法的語義
方法 |
語義 |
GET |
獲取指定資源 |
DELETE |
刪除指定資源 |
POST |
傳送資料給伺服器,依據HTTP 1.1規範中的描述,結合實際專案開發經驗,POST經常為了以統一的方法來涵蓋以下功能:1在公告板,新聞組,郵件列表或類似的文章組中釋出訊息2通過註冊新增使用者,3向資料處理程式提供一批資料,例如提交一個表單 |
PUT |
使用請求中的負載建立或者替換目標資源。PUT和POST的區別在於PUT是冪等的,而POST不是。冪等的含義可以理解為呼叫一次與連續呼叫多次是等價的(沒有副作用或副作用不變) |
POST和PUT的區別
- POST和PUT的區別容易被簡單地誤認為“POST表示建立資源,PUT表示更新資源”
- 而實際上,二者均可用於建立資源,更為本質的差別是在冪等性方面
HTTP的冪等性
方法 |
冪等性 |
冪等性分析 |
GET |
具備冪等性 |
用於獲取資源,沒有副作用,所以是冪等的。請注意,這裡強調的是一次和N次並不是說每次請求的結果相同,而是每次請求不會產生不同的副作用。 |
DELETE |
具備冪等性 |
用於刪除資源,有副作用,但它應該滿足冪等性,呼叫一次和N次對系統產生的副作用是相同的 |
POST |
不具備冪等性 |
POST所指向資源並非POST要建立的資源本身,而是POST建立資源的接收者,比如POST:/news的含義是在news新聞組這個資源分類下新建一條新的新聞,所以兩次相同的POST請求會在伺服器端建立兩份新的資源,它們是不同的。所以,POST方法不具備冪等性 |
PUT |
具備冪等性 |
PUT對應的資源是要建立或更新的資源本身,語義是建立或更新,對同一資源進行多次PUT的副作用和一次PUT是相同的,因此,PUT方法具有冪等性 |