爲你揭開 Restful 的面紗

一,前言

其實,我懷疑你並不瞭解 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,需要符合以下幾個原則:

  1. 資源:每一個 URI ,代表一種資源
  2. Representational :客戶端和服務器之間會傳遞這種資源的某個表現層
  3. State Transfer:客戶端通過四個 HTTP 動詞,對服務器端資源進行操作

五,四個 HTTP 動詞

HTTP 協議中,有四個表示操作方式的動詞,代表對資源的不同操作:

HTTP 方法 對資源的操作 冪等性 安全性
GET 獲取資源
POST 新建資源
PUT 更新資源
DELETE 刪除資源

我們看到上面提到了冪等性與安全性這兩個名詞,那麼這兩個名詞究竟是什麼意思呢?

  1. 冪等性:對同一 REST 接口的多次訪問,得到的資源狀態相同
  2. 安全性:對 REST 接口的訪問,不會使服務器端資源的狀態發生改變

六,接口寫法

傳統的 URI 請求格式

我們先來看看傳統的 URI 請求格式,看看有什麼問題。

  1. http://127.0.0.1/user/query/1 : 表示根據 id 查詢用戶數據
  2. http://127.0.0.1/user/save : 表示新增用戶數據
  3. http://127.0.0.1/user/update : 表示修改用戶數據
  4. http://127.0.0.1/user/delete : 表示刪除用戶數據

大家看這樣的 URI 請求格式如何?也許有的同學會說,設計的不錯啊,條理清晰,沒啥大毛病啊。但事實上,這樣的 URI 請求格式是不符合 RESTful 架構的,因爲這些 URI 都包含了動詞。

我們之前說,資源是具體信息,所以它應該是名詞,因此,URI 中不應包含動詞,那麼我們應該如何表示對資源的操作,或者換句話說,動詞應該放在哪裏呢?其實,動詞應該放在 HTTP 協議中。

Restful 請求格式

我們說,動詞應該放在 HTTP 協議中,那麼具體應該怎麼設計請求格式呢?我們把傳統的四種 URI 請求格式稍作修改,去掉了 URI 中的動詞,將其放入 HTTP 協議中,修改後的請求格式如下:

  1. http://127.0.0.1/user/1 GET :表示根據 id 查詢用戶數據
  2. http://127.0.0.1/user POST :表示新增用戶數據
  3. http://127.0.0.1/user PUT : 表示修改用戶數據
  4. http://127.0.0.1/user DELETE : 表示刪除用戶數據

七,響應

在響應中,我們需要根據 http 響應碼,判斷請求狀態,並進行進一步的操作。

在這裏插入圖片描述

八,總結

在 Restful 架構中,URI 用於定位資源,而 HTTP 動詞描述了對資源進行什麼操作。

使用 Restful,我們可以實現以下目標:

  • 根據 URI 可以知道需要的資源
  • 根據 http method 可以知道對資源進行什麼樣的操作
  • 根據 http status code 可以知道返回結果

參考:理解RESTful架構
RESTful介紹和使用教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章