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