REST架構
你是如何理解上網這件事的?
打開瀏覽器,輸入網址,展現在你面前的就是一個網站了。
你可以在網站里看視頻、看博客、寫文章、聽音樂。
但凡寫過點代碼的人都知道,我們平時訪問的網站,其實是HTML,它不過是一個文本,只是通過渲染,在你面前變成了多姿多彩的網站。
上網這件事,其實就是把在服務器上的文本、視頻、音頻等資源,轉化一下形式,呈現在你面前而已。
我們訪問的每一個網址,都對應服務器上的一個具體資源,比如你現在看到的這篇文章,不過就是一個HTML文本而已。
這就是REST架構(Representational State Transfer),阮一峰老師翻譯叫【表現層狀態轉化】。
我們看到的網頁實際上是一個文本,狀態轉化一下,呈現在你面前的就是一個好看的網頁了。
你點擊網頁上的一個按鈕,網頁勢必有所變化,或者是打開一個新鏈接,或者是請求一些新的數據。
這個互動的過程,其實就是你在對服務器上的資源進行操作。
本質就好像你對自己電腦上的文件操作一樣。
不信你打開文件資源管理器,輸入網址,一樣的能訪問百度。
瀏覽器,實質上也是個文件資源管理器,只不過我們通常用來訪問遠程的資源,不然你復制一個文件夾的路徑在瀏覽器打開試試。
你會發現瀏覽器其實也可以當文件資源管理器來用。
你在本地寫了一個靜態HTML,預覽的時候,看到瀏覽器的鏈接也是這個HTML文件在你硬盤上的路徑。
對RESTful API的應用
文件資源管理器上,一個文件路徑代表一個文件,那么瀏覽器上,一個鏈接也代表一個資源文件。
你會在你的電腦上用動詞去命名一個文件或者文件夾嗎?
因此,如果遵循RESTful API,我們編寫url的時候,應該都是名詞,而不包含動詞。
比如我們在編寫【新增一個用戶信息】的接口的時候,寫出來的url很容易是localhost:8080/user/addUser
。
但其實寫出來的應該是localhost:8008/users
。
這也是很多人的設計誤區。
這樣一來有人就會問了,那我增刪改查,要怎么區分這些操作呢?
這些動作,可以用POST、DELETE、PUT、GET來標識。
我們就是通過這四個動作,來實現對服務器上的資源進行操作的。
同樣是對用戶信息進行操作,我們編寫出來的接口可以是這樣的:
# 獲取用戶列表
GET localhost:8008/users
# 獲取單個用戶
GET localhost:8008/users/userid
# 新增用戶
POST localhost:8008/users
# 刪除指定用戶
DELETE localhost:8008/users/userid
# 更新用戶信息
PUT localhost:8008/users/userid
不用怕鏈接沖突,你換了個動作,就是個新的操作。
看了上面的鏈接,其實也可以明白,GET代表查詢,POST代表新增,DELETE代表刪除,PUT則代表更新。
在RESTful架構中,每個網址代表一種資源,所有網址中不能有動詞,只能有名詞,而且所用的名詞往往與數據庫的表格名對應。一般來說,數據庫中的表都是同種記錄的"集合",所以API中的名詞也應該使用復數。
這樣一來,我們對於編寫鏈接,就有了個比較好的規范。
說到這里,可能說了一堆廢話,畢竟有人覺得,localhost:8080/user/addUser
這種寫法並不影響使用,並且對很多人來說簡單明了,為什么還要遵循這種看起來沒什么用的API呢?
《Don't make me think》是一本講網站設計的書,這是一本很好的書。
里面是這么看待約束和設計的(當時覺得挺好的就摘抄下來了,不過因為時間久了,我也忘記這段話是原文摘抄還是自己編輯過了):
有一種方式看待設計——任何類別的設計,那就是,它的本質就是處理各種約束(那些你必須遵從和不能去做的事)和妥協(那些為了服從約束而做出的不夠理想的選擇)。
用林肯的話說,你能做到的最好的方式就是在某些時候取悅某些人。
(注:他確實說過這樣的話:“你可以在所有時間欺騙一些人,或者在某些時間欺騙所有人,但你不可能在所有時間欺騙所有人。”我從互聯網上學到的一件事是,如果看到某些名人名言,有92%的概率他們從沒說過這些話。)
有一種成熟的主張認為,約束,與其說他們是一種負面因素,還不如說它們實際上會讓設計變得更加容易,也會催生出新的創意。
的確,約束常常會幫助我們。如果需要適合放在給定的空間里,同時還需要符合給定的配色方案,實際上往往會讓我們更容易找到一張這樣的沙發,而不是漫無目的地尋找某張沙發。確定了某些約束會有種讓注意力聚焦的效果,而一張有無限可能的空白畫布——雖然它聽起來是種解放——但可能會帶來想法癱瘓。
RESTful API是個很好的設計原則,它約束我們只能用名詞去命名url,動作只能用GET、PUT來實現,這看起來是沒什么作用的規矩,但最起碼,在我url多到不知道下一個url怎么寫的時候,遵循這個原則,能讓我更好更快地想到下一個url怎么寫。
再進一步,寫的url越來越多,就感覺對【上網其實是在操作服務器上的文件資源】這個本質認知更深。
一個好的設計,應該是能讓我們在遵循這個設計原則的時候,不僅能提高效率,而且能讓我們對事物有更好的認知。