為啥REST如此重要?

2021-08-27 20:16:56 字數 2650 閱讀 3239

本文我們將討論 rest,它定義了一組體系架構原則,您可以根據這些原則設計以系統資源為中心的 web 服務,這是乙個非常容易讓人誤解的概念。本文主要是寫給那些想設計 webservice api 但卻對 rest 沒有十分清晰認識的開發者們。在本文最後會附上一些資源供大家學習,這些資源講解非常詳細。

什麼是rest

表徵狀態轉移(representional state transfer),是roy fielding( http 規範的主要編寫者之一)博士在 2000 年他的博士**中提出來的一種軟體架構風格。它並不是乙個標準,而是通過表徵(representional )來描述傳輸狀態的一種原則。其宗旨是從資源的角度來觀察整個網路,分布在各處的資源由 uri 確定,而客戶端的應用通過 uri 來獲取資源的表徵。獲得這些表徵致使這些應用程式轉變了其狀態。隨著不斷獲取資源的表徵,客戶端應用不斷地在轉變著其狀態。

目前在三種主流的 web 服務實現方案中,因為 rest 模式的 web 服務與複雜的 soap 和 xml-rpc 相對比,更加簡潔,越來越多的 web 服務開始採用 rest 風格設計和實現。例如,amazon.com 提供接近 rest 風格的 web 服務進行圖書查詢;雅虎提供的 web 服務也是 rest 風格的。

讓我們來思考一下:

marcus 是乙個農民,他有 4 頭牛,12 隻雞和 3 頭奶牛。他現在模擬乙個 rest api,而我是客戶端。如果我想用 rest 來請求當前的農場狀態,我僅會問:「state?」marcus 會回答:「4 頭豬、12 隻雞、3 頭奶牛」。

這是 rest 最簡單的乙個例子。marcus 使用表徵來傳輸農場狀態。表徵的句子很簡單:「4 頭豬、12 隻雞、3 頭奶牛」。

再往下看,看我如何讓 marcus 用 rest 方式新增 2 頭奶牛?

按照常理,可以會這樣說:marcus,請在農場你再新增 2 頭奶牛。難道這就是 rest 方式嗎?難道就是通過這樣的表徵來傳輸狀態的嗎?不是的!這是乙個遠端過程呼叫,過程是給農場新增 2 頭奶牛。

marcus 很憤怒地響應到:「400,bad request」,你到底是什麼意思?

所以,讓我們重新來一次。我們怎樣做到 rest 方式呢?該怎樣重新表徵呢?它應該是 4 頭豬、12 隻雞、3 頭奶牛。好,讓我們再次重新表徵……

我:「marcus,……4 頭豬、12 隻雞、5奶牛!」

marcus:「好的」。

我:「marcus,現在是什麼狀態?」

marcus:「4 頭豬、12 隻雞、5 頭奶牛」。

我:「好!」

看到了嗎?就這樣簡單。

為什麼 rpc 也不夠好?

從邏輯角度來看,為什麼會更加青睞 rest 而不是rpc(remote procedure call,遠端過程呼叫 ),因為它極大的降低了我們溝通的複雜度,通過把表徵作為唯一的溝通的方式。無需去討論過程(新增一頭牛?增加一種動物型別?給雞的數量翻倍還是賣掉所有豬?)我們只需討論表徵,並且使用這個表徵來達到我們想要的目標,很簡單,不是嗎?我不希望和 marcus 的溝通失敗,因為我們彼此的理解過程會不一樣,所以只需要知道最後的狀態就行。但這僅僅是建立 rpc 會產生許多問題之一。如果你使用 rpc,你需要設計一些程式嵌入到某種結構中。這種結構需要儲存引數、錯誤的**、返回值等。我已經看到許多公司這樣做,他們設計自己的 rpc-結構來實現客戶端與伺服器端的互動,但卻產生許多問題。你為什麼要這麼做?為什麼要建立自己的 rpc-結構?這樣做的好處是?倘若我想要讓應用程式使用許多 webservice,並且這些 webservice 帶有多個 rpc-格式屬性?那麼我不得不去開發一些類似這樣的東西:

如果你們真的需要 rpc,至少要選擇乙個類似 soap 的標準。

但 soap 也很糟糕

即使 rpc 的標準真的很令人痛苦,但我不得不承認 acid 事務,乙個完整的標準化服務描述性語言 soap(****** object access protocol,簡單物件訪問協議)在某些環境下表現的還不錯。儘管如此,soap 產品的效能開銷很大,它是乙個巨大的效能殺手。雖然 rest 不是乙個標準,但在實現 restful web 服務時可以使用其他各種標準(比如 http、url、xml、png 等)。

session 更**

你無需 session!但有人會說:「我想要儲存使用者購物車裡的商品,所以我必須要 session!」不,這樣想是錯誤的!即使沒有 session,你也可以做你任何你想做的事情。你可以只需在 url 裡封裝購物車資訊,或者為購物車建立另乙個資源,比如「/carts/5235」。

不需要與客戶端進行會話,通過這些操作(指在 url 裡封裝購物車資訊,或者為購物車建立另乙個資源,比如「/carts/5235」)後,客戶端向伺服器發出請求後,哪怕你在伺服器上執行解除安裝平台和作業系統、拆除伺服器硬體、重新組裝伺服器、重新安裝作業系統、平台、應用程式備份恢復操作,也不會影響客戶端。

不要強迫客戶端儲存狀態,這樣做不僅複雜,而且還會帶來許多問題,你應該從你的 web 應用程式裡刪除有狀態的東西。

不要重造超**

英文原文:why rest is so important

譯文原文:

專案啟動居然如此重要!

專案的啟動階段比較短,專案經理往往容易忽視這個階段,但是,專案的啟動卻具有著重要的意義。定基調 基調包括工作的節奏 團隊氛圍和溝通風格等。一首歌的第一句決定了這首歌的基調,如何唱好這第一句就是專案啟動所要關注的。好的開始是成功的一半,專案團隊工作的節奏 氛圍以及後來和干係人的溝通都和這個階段的關係非...

為什麼IT安全組如此重要?

安全組會保護亦會破壞您的it網路安全,該組成員主要負責管理網路中的訪問許可權,如對資源和資料的訪問許可權。但您有沒有想過,乙個組成員身份的配置錯誤可能會導致一些安全事件的發生?深度剖析組成員許可權 在安全方面,active directory和azure ad中的組成員身份通常會被低估,成員身份通常...

譯文 為什麼軟體架構如此重要?

本文翻譯自 why software architecture matters 拋開某項特定的技術或某個特定的專案不說,這篇文章我想講講關於犯錯這個話題。談論和讚揚成功也許很輕鬆,但是我發現犯錯仍是個很有意思的話題。主要是因為它們在學習的過程中頗有用處。一開始我將講一些背景知識,然後闡述一下我對軟體...