RESTFUL 開發(fā)設(shè)計規(guī)范
上節(jié)我們剛了解完 URI ,知道它是一種資源標(biāo)識,而 URL 是 schema = Http 的子標(biāo)識,本節(jié)要講的 Restful 從小的講是對 URL 格式提出了限制,對接口設(shè)計規(guī)范的倡導(dǎo),大的說它是一種通信架構(gòu)的指導(dǎo)。
1. RESTFUL 的誕生
1.1 作者
Restful 是由 Roy Thomas Fielding 博士在 2000 年所著的博士論文提起的,系統(tǒng)全面地闡述了 REST 的架構(gòu)風(fēng)格和設(shè)計思想,這位作者同時是 HTTP、URI等 Web 架構(gòu)標(biāo)準(zhǔn)的主要設(shè)計者,因此他提出的 REST 概念得到很多人的關(guān)注和響應(yīng)。
1.2 背景
Web 網(wǎng)站從最初的靜態(tài)資源展示,演變成后來的動態(tài)網(wǎng)站,到現(xiàn)在大部分的軟件都在往云上遷移,之前很多桌面應(yīng)用現(xiàn)在都盡量地改造成 Web 系統(tǒng),用戶不需要下載安裝繁瑣的軟件,打開瀏覽器輸入地址即可使用。
在這么一個背景下,Web 系統(tǒng)的通信架構(gòu)變得尤為重要。Roy Thomas Fielding 在論文中提到:“我這篇文章的寫作目的,就是想在符合架構(gòu)原理的前提下,理解和評估以網(wǎng)絡(luò)為基礎(chǔ)的應(yīng)用軟件的架構(gòu)設(shè)計,得到一個功能強(qiáng)、性能好、適宜通信的架構(gòu)。REST 指的是一組架構(gòu)約束條件和原則?!?/p>
Tips:有興趣的同學(xué)可以詳細(xì)的看下REST 論文。
2. RESTFUL 的思想內(nèi)容
Rest(Representational State Transfer),從詞面上來解析是 表述性狀態(tài)轉(zhuǎn)移。我們知道 URI 是一種標(biāo)識,這個標(biāo)識不管是地址還是昵稱,他都只是一個名詞(URL 上面最好不要用動詞),API 接口是有 增刪改查 一系列動作,將 URL 與行為狀態(tài)的結(jié)合就是 Restful 的核心思想。一個 API 請求我們既要知道它要操作的是哪個資源,也要知道它要對這個資源進(jìn)行什么操作。
2.1 API 接口規(guī)范
Restful 提倡將接口的行為狀態(tài)放到了 Http 的頭部 method 里。對同一個資源的不同操作,接口 URL 可能是一樣的。行為規(guī)約主要有下面幾項:
GET
查詢資源,不會對資源產(chǎn)生變化的都用 GET。
例:查詢慕課網(wǎng) http Wiki 教程的所有小節(jié)列表:
GET http://idcbgp.cn/http
如果資源查詢的過程需要帶過濾參數(shù),建議使用 URL 參數(shù)的形式:
例:查詢慕課網(wǎng) http 小節(jié)中作者是 rj 的文章
GET http://idcbgp.cn/http?author=rj
例:查詢慕課網(wǎng) http 里面 id = 1 的文章
GET http://idcbgp.cn/http/1
POST
新增某個資源:
POST http://idcbgp.cn/http
具體的參數(shù)放請求體中
{
"title":"restful",
"author":"rj",
"content":"xxxxxx"
}
PUT
資源的修改:
PUT http://idcbgp.cn/http/{articleId}
具體的參數(shù)放請求體中
{
"title":"restful",
"author":"rj",
"content":"xxxxxx"
}
PATCH
PATCH http://idcbgp.cn/http/{articleId}
patch
跟 put
都是修改的意思,put 類型的修改請求體中需要包含全量的對象信息,而 patch 只需要帶上要修改的某幾個對象即可,沒有帶上的參數(shù)就代表不更新,采用原來的值。
具體的參數(shù)放請求體中
{
"title":"aaa"
}
DELETE
刪除資源:
DELETE http://idcbgp.cn/http/{articleId}
2.2 REST 架構(gòu)
大部分人認(rèn)識的 REST 都是一個 API 的定義風(fēng)格,但它其實定義的是一整個軟件的通信架構(gòu)。不過我覺得不理解這部分問題不大,因為如果要說 Web 的架構(gòu),那真的是太豐富了,主要還是要尋找適合自己業(yè)務(wù)的。本著知識拓展,我們來了解下 REST 對架構(gòu)都做了哪些約束:
-
Client-Server:客戶端/服務(wù)端 模式的架構(gòu);
-
Stateless:無狀態(tài),服務(wù)端不保存客戶端信息;
-
Cache:客戶端可以緩存服務(wù)端數(shù)據(jù);
-
Uniform Interface:統(tǒng)一接口(包含上面講的 API 約束);
-
Layered System:分層架構(gòu),職責(zé)明確,方便拓展等;
-
Code-on-Demand:客戶端從服務(wù)器獲取需要的代碼,在客戶端處執(zhí)行。這個我覺得在邊緣計算的場景可以應(yīng)用,客戶端按需從中心拉取代碼,實現(xiàn)不同效果的處理計算。比如我要識別天氣就拉取天氣相關(guān)代碼,要識別花草就拉取花草的識別算法,就可以無限的賦能(可能將傳感器識別的信息上傳到云端分析所消耗的帶寬比獲取一個相應(yīng)場景的算法來得大),想想還是不錯的。
Tips:REST 相應(yīng)的論文部分。
3. 小結(jié)
Restful 風(fēng)格一般指的是 API 的設(shè)計規(guī)范,REST 是由 Roy Thomas Fielding 教授提出來的,該作者同時是 HTTP 協(xié)議的重要參與者。REST 的論文中對 Web 系統(tǒng)機(jī)構(gòu)提出了一些指導(dǎo)的理論,這些思想都非常不錯,但是我們今天的軟件架構(gòu)正變得越來越復(fù)雜,熔斷 / 限流 / 鏈路跟蹤 等等,還有很多要考慮的。