RESTful 設計風格

概念

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

個人灼見。如有出入,懇請指教🙏

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