在程序猿DD Spring Boot基礎(chǔ)教程的開山篇《基礎(chǔ)項(xiàng)目構(gòu)建,引入Web模塊,完成一個(gè)簡單的RESTful API》中,RESTful?是什么呢?
那么先百度一下:一種軟件構(gòu)架風(fēng)格,設(shè)計(jì)風(fēng)格而不是標(biāo)準(zhǔn),只是提供了一組設(shè)計(jì)原則和約束條件。它主要用于客戶端和服務(wù)器交互類的軟件?;谶@個(gè)風(fēng)格設(shè)計(jì)的軟件可以更加簡潔,更有層次,更用以實(shí)現(xiàn)緩存等機(jī)制。
是不是一頭霧水,百度百科中對REST以及RESTful有非常理論的介紹,不過雖然耐著性子看完了,仍然不知所云。好在知乎有《怎樣用通俗的語言解釋REST,以及RESTful?》。
那么本文將對答者的回答自行梳理一下:
????要了解REST,首先需要了解API(Application Programming Interface,應(yīng)用程序編程接口)。什么是API呢?首先它的定義是一個(gè)接口,舉個(gè)形象的例子來說,就是一個(gè)公司比如騰訊,他們對自己項(xiàng)目封裝,提供一個(gè)API,然后我們或者一些小公司可以通過這些API,對封裝的這個(gè)項(xiàng)目進(jìn)行交互。通過這個(gè)渠道打到我們的目的。
????了解了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,因?yàn)镽EST是基于Web應(yīng)用的。Web:分布式信息系統(tǒng)為超文本文件和其他對象(資源)提供訪問入口。資源是Web構(gòu)架的關(guān)鍵點(diǎn),當(dāng)資源與Web交互時(shí),它需要3個(gè)操作,識別(identify),表示(represent),交互(interact with),通過這三個(gè)操作,又引入了3個(gè)概念uri(統(tǒng)一資源標(biāo)識符包括url和urn)識別資源;representation(例如html,xml,視頻,圖片)表示資源;通過協(xié)議(包括http,ftp等)與資源進(jìn)行交互。
??如果我們想將一個(gè)資源文件顯現(xiàn)出來,就要通過uri進(jìn)行暴露。uri的設(shè)計(jì)只是負(fù)責(zé)把資源通過合理的方式暴露出來。對資源沒有任何操作,操作是通過http動(dòng)詞來實(shí)現(xiàn)的,所以REST通過URI暴露資源時(shí),會(huì)強(qiáng)調(diào)不要再URI中出現(xiàn)動(dòng)詞。
??比如:左邊的是錯(cuò)誤的設(shè)計(jì),右邊的是正確的
GET???? /rest/api/getDogs????——> GET?????/rest/api/dogs????? 獲取所有的小狗
GET????/rest/api/addDogs????——> POST????????/rest/api/dogs??????添加一個(gè)小狗
GET????/rest/api/editDogs/:dog_id????——>????PUT????/rest/api/dogs/:dog_id????修改一個(gè)小狗
GET????/rest/api/deleteDogs/:dog_id????——>????DELETE????/rest/api/dogs/:dog_id????刪除一個(gè)小狗
左邊的這種設(shè)計(jì),不符合REST風(fēng)格,uri只負(fù)責(zé)準(zhǔn)確無誤的暴露資源,而getDogs、addDogs已經(jīng)包含了對資源的操作,這是不對的。而右邊是通過具體的Http動(dòng)詞來體現(xiàn)。所以很容易理解REST很好利用了HTTP本來的特性,而不是只是將HTTP作為傳輸層這么簡單。
總結(jié)一下:URL定位資源,用HTTP動(dòng)詞(GET,POST,DELETE,DETC)描述操作。