一,前言
其實,我懷疑你並不瞭解 Restful ,不過沒關係,今天,就讓我來爲大家揭開 Restful 的面紗,帶大家看一些深層次的東西吧。
二,什麼是 Restful?
Restful 是一種最流行的互聯網架構。在介紹 Restful 之前,我們先介紹一下 REST。
REST 是 Fielding 大神在2000年時提出的,這位大神非同小可,不僅是 HTTP 協議的主要設計者,還是 Apache 基金會的第一任主席。故當他提出 REST 的概念時,便如同一石激起千層浪,對互聯網行業產生了巨大的影響。
REST 即 Representational State Transfer,中文翻譯是表現層狀態轉化,表示了 Fielding 大神對互聯網軟件架構原則的思考。
若一個架構符合 REST,那麼我們稱其爲 RESTful 架構。
看到這裏,可能大家還是一頭霧水,博主你倒是說說什麼是 REST 啊,你說符合 REST 的就是 RESTful 架構,我們又怎麼知道什麼是 REST 呢?別急,理解 REST 並不是一件容易的事情,且聽我慢慢述說。
我們之前說過,REST 是 Representational State Transfer ,這幾個單詞連在一起可能比較難以理解,但是我們可以換個思路,先理解每個單詞的意思,再把單詞的語義連起來,這樣不就得到了 REST 的語義了?
三,各個單詞的語義
資源
我們說,REST 的語義是表現層狀態轉化,其實我們省略了主語,這個主語就是 “資源”,表現層是資源的表現層。
那麼,什麼是資源呢?資源,是網絡上的一個具體信息,例如,一首歌是資源,一段文字是資源,一張圖片亦是資源。我們可以使用一個 URI 指向資源,每一種資源對應特定的 URI 。每當我們需要訪問資源的時候,只需訪問其 URI 即可。
我們可以這麼理解,URI 是資源的地址。所謂互聯網上資源的調用,實際上就是調用資源所對應的 URI 。
Representational
Representational ,即表現層。
資源是具體信息,但信息可能有多種表現形式,舉個例子,文本可以用 txt 格式實現,可以用 html 格式實現,還可以用二進制格式實現。我們把資源呈現出來的形式,稱爲它的表現層。
總的來說,URI 只代表資源的實體,不代表它的形式。
State Transfer
State Transfer 即狀態轉化。
當我們訪問網站時,實際上是一個客戶端和服務器互動的過程,在這個過程中會造成數據和狀態的變化。
我們知道 HTTP 協議是一個無狀態協議,所有的狀態都保存在服務器端。若客戶端想要操作服務器,必須通過某種手段,使服務器端發生狀態轉化。由於這種轉化是在表現層之上的,所以又稱爲表現層狀態轉化。
所謂的手段,不過是 HTTP 協議罷了。實際上,HTTP 協議有四個動詞,分別代表四種基本操作,這個在我們後文會詳細介紹。
四,回到原點:到底什麼是 Restful?
我們說,若一個架構符合 REST,那麼我們稱其爲 RESTful 架構,然後我們又介紹了一下 REST,那麼,是時候我們該給 Restful 做個簡單的總結了。所謂 Restful,需要符合以下幾個原則:
- 資源:每一個 URI ,代表一種資源
- Representational :客戶端和服務器之間會傳遞這種資源的某個表現層
- State Transfer:客戶端通過四個 HTTP 動詞,對服務器端資源進行操作
五,四個 HTTP 動詞
HTTP 協議中,有四個表示操作方式的動詞,代表對資源的不同操作:
HTTP 方法 | 對資源的操作 | 冪等性 | 安全性 |
---|---|---|---|
GET | 獲取資源 | 是 | 是 |
POST | 新建資源 | 否 | 否 |
PUT | 更新資源 | 是 | 否 |
DELETE | 刪除資源 | 是 | 否 |
我們看到上面提到了冪等性與安全性這兩個名詞,那麼這兩個名詞究竟是什麼意思呢?
- 冪等性:對同一 REST 接口的多次訪問,得到的資源狀態相同
- 安全性:對 REST 接口的訪問,不會使服務器端資源的狀態發生改變
六,接口寫法
傳統的 URI 請求格式
我們先來看看傳統的 URI 請求格式,看看有什麼問題。
- http://127.0.0.1/user/query/1 : 表示根據 id 查詢用戶數據
- http://127.0.0.1/user/save : 表示新增用戶數據
- http://127.0.0.1/user/update : 表示修改用戶數據
- http://127.0.0.1/user/delete : 表示刪除用戶數據
大家看這樣的 URI 請求格式如何?也許有的同學會說,設計的不錯啊,條理清晰,沒啥大毛病啊。但事實上,這樣的 URI 請求格式是不符合 RESTful 架構的,因爲這些 URI 都包含了動詞。
我們之前說,資源是具體信息,所以它應該是名詞,因此,URI 中不應包含動詞,那麼我們應該如何表示對資源的操作,或者換句話說,動詞應該放在哪裏呢?其實,動詞應該放在 HTTP 協議中。
Restful 請求格式
我們說,動詞應該放在 HTTP 協議中,那麼具體應該怎麼設計請求格式呢?我們把傳統的四種 URI 請求格式稍作修改,去掉了 URI 中的動詞,將其放入 HTTP 協議中,修改後的請求格式如下:
- http://127.0.0.1/user/1 GET :表示根據 id 查詢用戶數據
- http://127.0.0.1/user POST :表示新增用戶數據
- http://127.0.0.1/user PUT : 表示修改用戶數據
- http://127.0.0.1/user DELETE : 表示刪除用戶數據
七,響應
在響應中,我們需要根據 http 響應碼,判斷請求狀態,並進行進一步的操作。
八,總結
在 Restful 架構中,URI 用於定位資源,而 HTTP 動詞描述了對資源進行什麼操作。
使用 Restful,我們可以實現以下目標:
- 根據 URI 可以知道需要的資源
- 根據 http method 可以知道對資源進行什麼樣的操作
- 根據 http status code 可以知道返回結果