RESTful API實踐總結


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越來越多,就感覺對【上網其實是在操作服務器上的文件資源】這個本質認知更深。

一個好的設計,應該是能讓我們在遵循這個設計原則的時候,不僅能提高效率,而且能讓我們對事物有更好的認知。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM