在程序猿DD Spring Boot基礎(chǔ)教程的開山篇《基礎(chǔ)項目構(gòu)建投队,引入Web模塊寝志,完成一個簡單的RESTful API》中,RESTful?是什么呢缸剪?
那么先百度一下:一種軟件構(gòu)架風(fēng)格局齿,設(shè)計風(fēng)格而不是標準,只是提供了一組設(shè)計原則和約束條件橄登。它主要用于客戶端和服務(wù)器交互類的軟件抓歼。基于這個風(fēng)格設(shè)計的軟件可以更加簡潔拢锹,更有層次谣妻,更用以實現(xiàn)緩存等機制。
是不是一頭霧水卒稳,百度百科中對REST以及RESTful有非常理論的介紹蹋半,不過雖然耐著性子看完了,仍然不知所云充坑。好在知乎有《怎樣用通俗的語言解釋REST减江,以及RESTful?》捻爷。
那么本文將對答者的回答自行梳理一下:
????要了解REST辈灼,首先需要了解API(Application Programming Interface,應(yīng)用程序編程接口)。什么是API呢也榄?首先它的定義是一個接口巡莹,舉個形象的例子來說,就是一個公司比如騰訊甜紫,他們對自己項目封裝降宅,提供一個API,然后我們或者一些小公司可以通過這些API囚霸,對封裝的這個項目進行交互腰根。通過這個渠道打到我們的目的。
????了解了API拓型,那么REST是什么呢额嘿?他是一種構(gòu)架風(fēng)格,騰訊這類公司要遵循這種風(fēng)格建立API吨述。那么REST的具體風(fēng)格是什么呢岩睁?REST(Representational State Transfer)(表現(xiàn)層狀態(tài)轉(zhuǎn)移)。又是一頭霧水揣云,什么是表現(xiàn)層狀態(tài)轉(zhuǎn)移呢捕儒?
????這里我們要了解一下Web,因為REST是基于Web應(yīng)用的。Web:分布式信息系統(tǒng)為超文本文件和其他對象(資源)提供訪問入口刘莹。資源是Web構(gòu)架的關(guān)鍵點阎毅,當(dāng)資源與Web交互時,它需要3個操作点弯,識別(identify)扇调,表示(represent),交互(interact with)抢肛,通過這三個操作狼钮,又引入了3個概念uri(統(tǒng)一資源標識符包括url和urn)識別資源;representation(例如html捡絮,xml熬芜,視頻,圖片)表示資源福稳;通過協(xié)議(包括http涎拉,ftp等)與資源進行交互。
??如果我們想將一個資源文件顯現(xiàn)出來的圆,就要通過uri進行暴露鼓拧。uri的設(shè)計只是負責(zé)把資源通過合理的方式暴露出來。對資源沒有任何操作越妈,操作是通過http動詞來實現(xiàn)的季俩,所以REST通過URI暴露資源時,會強調(diào)不要再URI中出現(xiàn)動詞叮称。
??比如:左邊的是錯誤的設(shè)計种玛,右邊的是正確的
GET???? /rest/api/getDogs????——> GET?????/rest/api/dogs????? 獲取所有的小狗
GET????/rest/api/addDogs????——> POST????????/rest/api/dogs??????添加一個小狗
GET????/rest/api/editDogs/:dog_id????——>????PUT????/rest/api/dogs/:dog_id????修改一個小狗
GET????/rest/api/deleteDogs/:dog_id????——>????DELETE????/rest/api/dogs/:dog_id????刪除一個小狗
左邊的這種設(shè)計,不符合REST風(fēng)格瓤檐,uri只負責(zé)準確無誤的暴露資源,而getDogs娱节、addDogs已經(jīng)包含了對資源的操作挠蛉,這是不對的。而右邊是通過具體的Http動詞來體現(xiàn)肄满。所以很容易理解REST很好利用了HTTP本來的特性谴古,而不是只是將HTTP作為傳輸層這么簡單。
總結(jié)一下:URL定位資源稠歉,用HTTP動詞(GET,POST,DELETE,DETC)描述操作掰担。