對restful 理解

1. 什麼是restful

    REST——Representational State Transfer,表現層狀態轉移。它被Roy Felding提出(在他的”基於網絡的軟件架構“論文中第五章)。REST的核心原則是將API拆分爲邏輯上的資源。這些資源通過http被操作(GET ,POST,PUT,DELETE)。

    如果一個架構符合rest原則,就稱它爲restful架構。

    理解restful架構,首先要理解rest

  • resources 資源是指網絡上的一個實體,或者說一個具體信息。而表現層實際上就是資源的表現層
  • representation 把”資源”具體呈現出來的形式,叫做它的”表現層”。
  • state transfer 訪問一個網站,一定涉及到客戶端和服務端的交互,也就一定存在數據和狀態的變化,這就是狀態轉化

    rest風格的特徵

  • 客戶端服務端分離

  • 無狀態
  • 緩存
  • 分層部署
  • 統一接口
  • 支持按需代碼

綜述:什麼是restful架構

  • 每一個URI代表一種資源
  • 客戶端和服務器之間,傳遞這種資源的某種表現層
  • 客戶端通過http動詞,對服務器端資源進行操作,實現“表現層狀態轉化”。
    就是用URL定位資源,用HTTP描述操作。
        看Url就知道要什麼
        看http method就知道幹什麼
        看http status code就知道結果如何

2. restful 實例及誤區

    restful 架構典型設計誤區

  • URI 包含動詞
    /posts/show/1 X
    /posts/1
    使用get方法實現show

3. restful API設計規範

  1. 協議
    API與用戶的通信協議,總是使用HTTPs協議

  2. 域名
    應該儘量將API部署在專用域名之下。
    如果確定API很簡單,不會有進一步擴展,可以考慮放在主域名下。

  3. URI規範
    不用大寫;
    用連字符’-’ 不用下劃線 ‘_’ ;
    參數列表要encode;

  4. HTTP動詞

動詞 說明
GET(SELECT) 從服務器取出資源(一項或多項)。
POST(CREATE) 在服務器新建一個資源。
PUT(UPDATE) 在服務器更新資源(客戶端提供改變後的完整資源)。
PATCH(UPDATE) 在服務器更新資源(客戶端提供改變的屬性)。
DELETE(DELETE) 從服務器刪除資源。
HEAD 獲取資源的元數據。
OPTIONS 獲取信息,關於資源的哪些屬性是客戶端可以改變的。


安全性和冪等性

安全性:不會改變資源狀態,可以理解爲只讀的;
冪等性:執行1次和執行N次,對資源狀態改變的效果是等價的。

方法 安全性 冪等性
GET
POST × ×
PUT ×
DELETE ×


    安全性和冪等性均不保證反覆請求能拿到相同的response。以 DELETE 爲例,第一次DELETE返回200表示刪除成功,第二次返回404提示資源不存在,這是允許的。
 
5. 錯誤處理
       不要發生了錯誤但給2xx響應,客戶端可能會緩存成功的http請求;
       正確設置http狀態碼,不要自定義;
       提供 a. 錯誤的代碼(日誌/問題追查);b. 錯誤的描述文本(展示給用戶)

常用狀態碼

狀態碼 error 使用場景
200 OK 服務器成功返回用戶請求的數據,該操作是冪等的(Idempotent)。
201 create - [POST/PUT/PATCH] 用戶新建或修改數據成功。
202 accepted 表示一個請求已經進入後臺排隊(異步任務)
204 no conflict - [DELETE] 用戶刪除數據成功。
400 bad request 常用在參數校驗
401 unauthorized 未經驗證的用戶,常見於未登錄。
403 forbidden 無權限
404 not found 資源不存在
500 internal server error 非業務類異常
503 service unavaliable 由容器拋出,自己的代碼不要拋這個異常


6. API的演進

常見的三種方式:

    在uri中放版本信息:GET /v1/users/1
    Accept Header:Accept: application/json+v1
    自定義 Header:X-Api-Version: 1
    用第一種,雖然沒有那麼優雅,但最明顯最方便。

參考文章:
http://novoland.github.io/%E8%AE%BE%E8%AE%A1/2015/08/17/Restful%20API%20%E7%9A%84%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83.html
http://www.ruanyifeng.com/blog/2011/09/restful.html
http://www.ruanyifeng.com/blog/2014/05/restful_api.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章