RESTful 架構(gòu)規(guī)范介紹
RESTful 架構(gòu)是目前流行的一種互聯(lián)網(wǎng)軟件架構(gòu)。它結(jié)構(gòu)清晰、符合標(biāo)準(zhǔn)、易于理解、擴(kuò)展方便,所以正得到越來(lái)越多網(wǎng)站的采用。本節(jié)講解 REST 的概念和 RESTful 架構(gòu)。
1. 什么是 REST
REST 全稱是 Representational State Transfer 的縮寫(xiě),中文翻譯是表述性狀態(tài)轉(zhuǎn)移。Roy Thomas Fielding 首次在他的博士論文中提出的 REST 這個(gè)概念,他把互聯(lián)網(wǎng)軟件的架構(gòu)原則,定名為 REST。
Roy Thomas Fielding 提出 REST 的概念,是為了得到一個(gè)以網(wǎng)絡(luò)為基礎(chǔ)的應(yīng)用軟件的架構(gòu),得到一個(gè)功能強(qiáng)、性能好、適宜通信的架構(gòu)。REST 指的是一組架構(gòu)約束條件和原則,如果一個(gè)架構(gòu)符合 REST 的約束條件和原則,我們就稱它為 RESTful 架構(gòu)。
雖然 REST 本身受 Web 技術(shù)的影響很深,但理論上,REST 架構(gòu)風(fēng)格并不是綁定在 HTTP 應(yīng)用上。目前 HTTP 是唯一與 REST 相關(guān)的應(yīng)用領(lǐng)域,因此 REST 通常是指基于 HTTP 實(shí)現(xiàn)的 REST。
2. 理解 REST
REST 是 Representational State Transfer 的縮寫(xiě),通過(guò)理解這個(gè)詞組中每個(gè)單詞的含義,去理解 REST。
2.1 資源 Resource
REST 的名稱 “表述性狀態(tài)轉(zhuǎn)移” 中,省略了主語(yǔ)。REST 的全稱應(yīng)該是 “資源表述性狀態(tài)轉(zhuǎn)移”。
所謂 “資源”,就是網(wǎng)絡(luò)上的一個(gè)實(shí)體,或者說(shuō)是網(wǎng)絡(luò)上的一個(gè)具體信息。面是一些資源的例子:
它可以是一段文本、一張圖片、一首歌曲、一種服務(wù),總之就是一個(gè)具體的實(shí)在,下
- 一張圖片
- 一個(gè)視頻
- 一篇文章
- 一篇回復(fù)
使用統(tǒng)一資源定位符 URI 指向資源,對(duì)應(yīng)一個(gè)特定的 URI。通過(guò) URI 要獲取這個(gè)資源,因此 URI 就成了每一個(gè)資源的地址或獨(dú)一無(wú)二的識(shí)別符。
下面以論壇為例,給出資源和相關(guān) URI:
資源 | URI |
---|---|
主題 | http://www.bbs.com/topics/123 |
回復(fù) | http://www.bbs.com/anwers/456 |
論壇中存在有多個(gè)主題 (topic),每個(gè)主題有一個(gè)唯一的 id,在這個(gè)例子中 /topics/123 標(biāo)識(shí)了一個(gè)主題;每個(gè)主題下存在相應(yīng)的回復(fù) (answer),每個(gè)回復(fù)有一個(gè)唯一的 id,在這個(gè)例子中 /answers/123 標(biāo)識(shí)了一個(gè)回復(fù)。
對(duì)每一種資源,可以進(jìn)行增加、修改、刪除的操作,在這個(gè)例子中,即為增加主題、修改主題、刪除主題。
2.2 表述性 Represtation
資源是一種信息實(shí)體,在外界的具體呈現(xiàn),可以有多種表述(或成為表現(xiàn)、表示)形式,在客戶端和服務(wù)端之間傳送的也是資源的表述,而不是資源本身。例如,文本資源可以采用 HTML、XML、JSON 等格式表現(xiàn),圖片資源可以使用 PNG 或 JPG 等等格式表現(xiàn)。
在 HTTP 協(xié)議中,客戶端可以通過(guò) Accept 消息頭請(qǐng)求一種特定格式的表述,服務(wù)端則通過(guò) Content-Type 告訴客戶端資源的表述形式。
例如,在服務(wù)端存在資源 icon.png,客戶端請(qǐng)求資源 icon.png 的 HTTP 報(bào)文如下:
GET /icon.png HTTP/1.1
Host: www.example.com
Connection: keep-alive
User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/81.0
Accept: text/html,image/png,*/*;
...
省略
...
在第 5 行,消息頭 Accept 描述客戶端希望接收的數(shù)據(jù)類型是 text/html 或者 image/png 格式。服務(wù)端收到請(qǐng)求報(bào)文后,響應(yīng)客戶端如下:
HTTP/1.1 200 OK
server: nginx/1.14.0 (Ubuntu)
date: Wed, 09 Sep 2020 07:52:21 GMT
content-type: image/png
content-length: 194
...
省略
...
在第 4 行,消息頭 content-type 描述了響應(yīng)報(bào)文中的數(shù)據(jù)類型是 image/png。
2.3 狀態(tài)轉(zhuǎn)移 State Transfrer
在客戶端和服務(wù)器的的互動(dòng)過(guò)程,客戶端需要通過(guò)某種手段讓服務(wù)器端發(fā)生 “狀態(tài)轉(zhuǎn)移”(State Transfer)。例如,在論壇中,論壇當(dāng)前包含的主題以及相應(yīng)的回復(fù),即為服務(wù)端的狀態(tài),增加、修改、刪除主題或者回復(fù),都會(huì)引起 “狀態(tài)轉(zhuǎn)移”。
根據(jù) HTTP 標(biāo)準(zhǔn),有 4 個(gè) HTTP 請(qǐng)求方法,可以用于服務(wù)端的 “狀態(tài)轉(zhuǎn)移”:
請(qǐng)求方法 | 功能 |
---|---|
GET | 獲取資源 |
POST | 新建資源 |
PUT | 更新資源 |
DELETE | 刪除資源 |
2.4 概括
綜合上面的解釋,總結(jié)一下什么是 REST:
-
服務(wù)端使用 URI 定位資源;
-
客戶端和服務(wù)器之間,傳遞這種資源的某種表現(xiàn)形式;
-
客戶端通過(guò)四個(gè) HTTP 方法 (GET/POST/PUT/DELETE),對(duì)服務(wù)器端資源進(jìn)行操作,實(shí)現(xiàn) “資源表述狀態(tài)轉(zhuǎn)移”。
3. 例子
REST 描述的是在網(wǎng)絡(luò)中客戶端和服務(wù)端的一種交互形式,遵循 REST 原則的軟件架構(gòu)被稱為 RESTful 架構(gòu),本小節(jié)一個(gè)具體的 RESTful 架構(gòu)的例子。
3.1 資源
在一個(gè)論壇中,有兩種類型的資源:主題和回復(fù),如下所示:
資源 | URI |
---|---|
主題 | http://www.bbs.com/topics/123 |
回復(fù) | http://www.bbs.com/anwers/456 |
每個(gè)資源都有自己的 URI,/topics/123 是 id 為 123 的主題對(duì)應(yīng)的 URI,/anwers/456 是 id 為 456 的回復(fù)對(duì)應(yīng)的 URI。
3.2 訪問(wèn)資源的 API
客戶端可以查看、新增、修改、刪除主題,相應(yīng)的 URI 如下:
HTTP 方法 | 行為 | URI |
---|---|---|
GET | 獲取所有的主題 | http://www.bbs.com/topics |
GET | 獲取特定的主題 | http://www.bbs.com/topics/123 |
POST | 新建主題 | http://www.bbs.com/topics |
PUT | 修改主題 | http://www.bbs.com/topics/123 |
DELETE | 刪除主題 | http://www.bbs.com/topics/123 |
客戶端可以查看、新增、修改、刪除回復(fù),相應(yīng)的 URI 如下:
HTTP 方法 | 行為 | URI |
---|---|---|
GET | 獲取所有的回復(fù) | http://www.bbs.com/answers |
GET | 獲取特定的回復(fù) | http://www.bbs.com/answers/456 |
POST | 新建回復(fù) | http://www.bbs.com/answers |
PUT | 修改回復(fù) | http://www.bbs.com/answers/456 |
DELETE | 刪除回復(fù) | http://www.bbs.com/answers/456 |
3.3 返回 JSON 格式的數(shù)據(jù)
客戶端訪問(wèn)操作資源的 URI 時(shí),服務(wù)端返回 JSON 格式的數(shù)據(jù)。例如:
1. 獲取特定的主題
客戶端獲取 id 為 123 的主題信息,發(fā)出如下請(qǐng)求:
GET /topics/123
服務(wù)端返回 JSON 格式的數(shù)據(jù):
{
"title": "今天吃什么?",
"content": "謝謝"
}
在返回的 JSON 數(shù)據(jù)中, title 表示主題的標(biāo)題,content 表示主題的正文。
2. 獲取所有的主題
客戶端獲取所有的主題信息,發(fā)出如下請(qǐng)求:
GET /topics
服務(wù)端返回 JSON 格式的數(shù)據(jù):
[
{
"title": "今天吃什么?",
"content": "謝謝"
},
{
"title": "今天下雨嗎?",
"content": "有誰(shuí)知道"
}
]
返回的 JSON 數(shù)據(jù)是一個(gè)數(shù)組,數(shù)組包含 2 項(xiàng)元素,每個(gè)元素表示一個(gè)主題。
4. 小結(jié)
本節(jié)講解了 REST 的概念和 RESTful 架構(gòu),使用思維導(dǎo)圖總結(jié)如下:
在下一個(gè)小節(jié)中,通過(guò)具體的實(shí)例理解 RESTful 架構(gòu)。