概念
REST(Representation State Transfer),譯爲表現層狀態轉移,太抽象了,這啥呢?其實RESTful是一種接口的設計風格,它主要用於面向資源編程,面向資源又是啥呢?
帶着一系列疑問,去網上查閱了大量的資料,以下是自己的一些理解:
理解
面向資源編程 的資源指的是客戶端在請求服務器的資源,此時我們應該明白,客戶端在請求服務器的資源使用的是URL或URI。從這個層面出發,我們應該發現問題,傳統的前端和後端代碼之間的編寫存在着千絲萬縷的關係,例如前端中使用的URL路徑直接與後端的web層交互,所以前端和後端的開發需要經常性溝通,才能確保設計出來的程序前後端可以正常交互。
但是這種手段無疑降低了開發的效率,還有可能出現問題後,出現前後端程序員互相帥鍋的可能。所以現在的程序我們都推崇使用前後端分類的開發技術,RESTful設計風格孕育而生了。
RESTful是目前最流行的API設計規範了,用於web網絡接口的設計。
請看下面這些傳統URL的設計:
# http://apo.demo/createNewCar //創建新車
# http://apo.demo/deleteCars //刪除新車
# http://apo.demo/updateCars //更新
# htpp://apo.demo/deleteRedCars //刪除紅車(更新部分)
# http://apo.demo/getAllCars //獲取所有車
這些URL都是我們前端程序員乾的活,當然後端程序員大概也看得懂這些請求都是幹嘛的,但是它就一定能從後端的接口對接嗎?顯然不一定!!因爲表單的請求方法並不清楚?
RESTful風格的URL設計:
# htpp://apo.demo/createNewCar //提供POST請求方法
# htpp://apo.demo/deleteCars //提供Delete請求方法
# htpp://apo.demo/updateCars //提供Put請求方法
# htpp://apo.demo/deleteRedCars //提供Patch請求方法
# htpp://apo.demo/getAllCars //提供Get請求方法
可見,此時前端的程序員又告訴後端程序員一些規範,只要後端程序員能遵從,便可以實現減少溝通,達到各自開發自己的業務的目的。
RESTful的核心思想就是客戶端發出的請求是由客戶端發出帶有信息的URL+操作指令構成,
# htpp://apo.demo/deleteRedCars/1 //提供Patch請求方法
表示的是刪除id = 1的紅車,現在是不是很清晰了。
所以RESTful風格的接口設計,讓我們以優雅的方式顯示資源,資源使用URL指定,/deleteRedCars/1
就能表示一個URI,表示的是刪除id = 1的紅車。
看到這邊可以把RESTful想成是一種建立在HTTP協議上的設計模式,充分利用了HTTP的特點,使用URI來表示資源,用不同的HTTP動詞(Get,Post,Put,Delete方法)來表示對資源的各種行爲,這樣做的好處就是實現了資源和操作分離。
服務器接收到客戶端的請求後,會處理,分析數據,然後進行響應,響應狀態嗎也是有講究的:
1xxx:相關信息
2xxx:操作成功
200:表示操作成功
201:POST返回201,表示生成了新資源
202:服務器接收到請求未處理,會在未來處理
204:DELETE返回204,表示資源已經不存在了
3xxx:重定向
302:重定向
4xxx:客戶端錯誤
402:用戶未通過身份驗證,或沒有身份驗證
403:用戶通過身份驗證,但是沒有訪問資源權限
404:用戶請求的資源不存在
5xxx:服務端錯誤
500:客戶端請求有效,但是服務端發生了意外
優勢
- 可以實現前後端分離,面向資源編程
- 充分的利用了HTTP協議本身的語義
- 無狀態,這點非常重要,在調用一個接口時(操作,訪問資源),可以不用考慮上下文的情況,不用考慮當前狀態,極大的降低的複雜度
劣勢
- RESTful透明化了你的URI,產生了安全性的問題。
- 如果系統比較龐大,裏面設計的業務比較複雜,RESTful的設計難度也會跟着提高。
小結
使用RESTful:
- 看URI就可以知道要什麼
- 看http method就知道要幹什麼
- 看http status code就知道結果如何
預防API被人攻擊可以啓用API調用速率機制,或者時Http cache機制。
參考:
https://mp.weixin.qq.com/s/HYUv21PNqIljdAtAFx181A
https://github.com/twtrubiks/django-rest-framework-tutorial/tree/master/RESTful-API-Tutorial
個人灼見。如有出入,懇請指教🙏