掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
RestFul API 是每個(gè)程序員都應(yīng)該了解并掌握的基本知識(shí),我們?cè)陂_發(fā)過程中設(shè)計(jì) API 的時(shí)候也應(yīng)該至少要滿足 RestFul API 的最基本的要求(比如接口中盡量使用名詞,使用 POST 請(qǐng)求創(chuàng)建資源,DELETE 請(qǐng)求刪除資源等等,示例:GET /notes/id:獲取某個(gè)指定 id 的筆記的信息)。

如果你看 RestFul API 相關(guān)的文章的話一般都比較晦澀難懂,包括我下面的文章也會(huì)提到一些概念性的東西。但是,實(shí)際上我們平時(shí)開發(fā)用到的 RestFul API 的知識(shí)非常簡(jiǎn)單也很容易概括!舉個(gè)例子,如果我給你下面兩個(gè) url 你是不是立馬能知道它們是干什么的!這就是 RestFul API 的強(qiáng)大之處!
RestFul API 可以你看到 url + http method 就知道這個(gè) url 是干什么的,讓你看到了 http 狀態(tài)碼(status code)就知道請(qǐng)求結(jié)果如何。
- GET /classs:列出所有班級(jí)
- POST /classs:新建一個(gè)班級(jí)
下面的內(nèi)容只是介紹了我覺得關(guān)于 RestFul API 比較重要的一些東西,歡迎補(bǔ)充。
一、重要概念
REST,即 REpresentational State Transfer 的縮寫。這個(gè)詞組的翻譯過來就是"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。這樣理解起來甚是晦澀,實(shí)際上 REST 的全稱是 Resource Representational State Transfe ,直白地翻譯過來就是 “資源”在網(wǎng)絡(luò)傳輸中以某種“表現(xiàn)形式”進(jìn)行“狀態(tài)轉(zhuǎn)移” 。如果還是不能繼續(xù)理解,請(qǐng)繼續(xù)往下看,相信下面的講解一定能讓你理解到底啥是 REST 。
我們分別對(duì)上面涉及到的概念進(jìn)行解讀,以便加深理解,不過實(shí)際上你不需要搞懂下面這些概念,也能看懂我下一部分要介紹到的內(nèi)容。不過,為了更好地能跟別人扯扯 “RestFul API”我建議你還是要好好理解一下!
綜合上面的解釋,我們總結(jié)一下什么是 RESTful 架構(gòu):
二、REST 接口規(guī)范
1、動(dòng)作
2、路徑(接口命名)
路徑又稱"終點(diǎn)"(endpoint),表示 API 的具體網(wǎng)址。實(shí)際開發(fā)中常見的規(guī)范如下:
Talk is cheap!來舉個(gè)實(shí)際的例子來說明一下吧!現(xiàn)在有這樣一個(gè) API 提供班級(jí)(class)的信息,還包括班級(jí)中的學(xué)生和教師的信息,則它的路徑應(yīng)該設(shè)計(jì)成下面這樣。
接口盡量使用名詞,禁止使用動(dòng)詞。 下面是一些例子:
- GET /classs:列出所有班級(jí)
- POST /classs:新建一個(gè)班級(jí)
- GET /classs/classId:獲取某個(gè)指定班級(jí)的信息
- PUT /classs/classId:更新某個(gè)指定班級(jí)的信息(一般傾向整體更新)
- PATCH /classs/classId:更新某個(gè)指定班級(jí)的信息(一般傾向部分更新)
- DELETE /classs/classId:刪除某個(gè)班級(jí)
- GET /classs/classId/teachers:列出某個(gè)指定班級(jí)的所有老師的信息
- GET /classs/classId/students:列出某個(gè)指定班級(jí)的所有學(xué)生的信息
- DELETE classs/classId/teachers/ID:刪除某個(gè)指定班級(jí)下的指定的老師的信息
反例:
- /getAllclasss
- /createNewclass
- /deleteAllActiveclasss
理清資源的層次結(jié)構(gòu),比如業(yè)務(wù)針對(duì)的范圍是學(xué)校,那么學(xué)校會(huì)是一級(jí)資源:/schools,老師: /schools/teachers,學(xué)生: /schools/students 就是二級(jí)資源。
3、過濾信息(Filtering)
如果我們?cè)诓樵兊臅r(shí)候需要添加特定條件的話,建議使用 url 參數(shù)的形式。比如我們要查詢 state 狀態(tài)為 active 并且 name 為 guidegege 的班級(jí):
- GET /classs?state=active&name=guidegege
比如我們要實(shí)現(xiàn)分頁(yè)查詢:
- GET /classs?page=1&size=10 //指定第1頁(yè),每頁(yè)10個(gè)數(shù)據(jù)
4、狀態(tài)碼(Status Codes)
三、HATEOAS
RestFul 的極致是 hateoas ,但是這個(gè)基本不會(huì)在實(shí)際項(xiàng)目中用到。
上面是 RESTful API 最基本的東西,也是我們平時(shí)開發(fā)過程中最容易實(shí)踐到的。實(shí)際上,RESTful API 最好做到 Hypermedia,即返回結(jié)果中提供鏈接,連向其他 API 方法,使得用戶不查文檔,也知道下一步應(yīng)該做什么。
比如,當(dāng)用戶向 api.example.com 的根目錄發(fā)出請(qǐng)求,會(huì)得到這樣一個(gè)文檔。
- {"link": {
- "rel": "collection https://www.example.com/classs",
- "href": "https://api.example.com/classs",
- "title": "List of classs",
- "type": "application/vnd.yourformat+json"
- }}
上面代碼表示,文檔中有一個(gè) link 屬性,用戶讀取這個(gè)屬性就知道下一步該調(diào)用什么 API 了。rel 表示這個(gè) API 與當(dāng)前網(wǎng)址的關(guān)系(collection 關(guān)系,并給出該 collection 的網(wǎng)址),href 表示 API 的路徑,title 表示 API 的標(biāo)題,type 表示返回類型 Hypermedia API 的設(shè)計(jì)被稱為HATEOAS。
在 Spring 中有一個(gè)叫做 HATEOAS 的 API 庫(kù),通過它我們可以更輕松的創(chuàng)建除符合 HATEOAS 設(shè)計(jì)的 API。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流