1. 程式人生 > >什麼是rest,什麼是restful

什麼是rest,什麼是restful

引子

      對於一個程式猿來說,不知道REST和RESTful那就尷尬了,當時與別人交流時,大家都在說REST或RESTful格式訪問,而你在一邊一臉懵逼,那就呵呵了。網上有很多關於這類的文章,但是多數是如何用,往往會給你一種盲人摸象的感覺,所以寫這篇部落格,僅僅是個人對REST及RESTful的理解。

什麼是REST?

       REST的出現可謂和網際網路是密不可分的。隨著網路的快速發展,網路環境越來越複雜,原有的web應用的之間的訪問方式不足以滿足需要。REST是由Roy Fielding在他的一篇博士論文《Architectural Styles and the Design of Network-based Software Architectures》提出的,中文名稱為《架構風格與基於網路的軟體架構設計》。有興趣的讀者可以來仔細研究,這裡就不做深入解讀。

       REST並不是一種具體的技術,也不是一種具體的規範,REST其實是一種內涵非常豐富的架構風格。作為一個web開發者,對於HTTP協議一定非常瞭解,而REST是HTTP/1.1協議等Web規範的設計指導原則,HTTP/1.1協議正是為實現REST風格的架構而設計的。新的Web規範,其設計必須符合REST的要求,否則整個Web的體系架構會因為引入嚴重矛盾而崩潰。

       要什麼理解REST,就需要理解REST的五個關鍵詞:資源(Resource)、資源的表述(Representation)、狀態轉移(State Transfer)、統一介面(Uniform Interface)、超文字驅動(Hypertext Driven)。

1.資源(Resource)

       資源是一種看待伺服器的方式,即將伺服器看作是由很多離散的資源組成。每個資源是伺服器上一個可命名的抽象概念。因為資源是一個抽象的概念,所以它不僅僅能代表伺服器檔案系統中的一個檔案、資料庫中的一張表等等具體的東西,可以將資源設計的要多抽象有多抽象,只要想象力允許而且客戶端應用開發者能夠理解。與面向物件設計類似,資源是以名詞為核心來組織的,首先關注的是名詞。一個資源可以由一個或多個URI來標識。URI既是資源的名稱,也是資源在Web上的地址。對某個資源感興趣的客戶端應用,可以通過資源的URI與其進行互動。

2.資源的表述(Representation)

       資源的表述是一段對於資源在某個特定時刻的狀態的描述。可以在客戶端-伺服器端之間轉移(交換)。資源的表述可以有多種格式,例如HTML/XML/JSON/純文字/圖片/視訊/音訊等等。資源的表述格式可以通過協商機制來確定。請求-響應方向的表述通常使用不同的格式。

3.狀態轉移(State Transfer)

       狀態轉移(state transfer)與狀態機中的狀態遷移(state transition)的含義是不同的。狀態轉移說的是:在客戶端和伺服器端之間轉移(transfer)代表資源狀態的表述。通過轉移和操作資源的表述,來間接實現操作資源的目的。

4.統一介面(Uniform Interface)

       REST要求,必須通過統一的介面來對資源執行各種操作。對於每個資源只能執行一組有限的操作。以HTTP/1.1協議為例,HTTP/1.1協議定義了一個操作資源的統一介面,主要包括以下內容:

  • 7個HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS

  • HTTP頭資訊(可自定義)

  • HTTP響應狀態程式碼(可自定義)

  • 一套標準的內容協商機制

  • 一套標準的快取機制

  • 一套標準的客戶端身份認證機制

       REST還要求,對於資源執行的操作,其操作語義必須由HTTP訊息體之前的部分完全表達,不能將操作語義封裝在HTTP訊息體內部。這樣做是為了提高互動的可見性,以便於通訊鏈的中間元件實現快取、安全審計等等功能。

5.超文字驅動(Hypertext Driven)

      “超文字驅動”又名“將超媒體作為應用狀態的引擎”(Hypermedia As The Engine Of Application State,來自Fielding博士論文中的一句話,縮寫為HATEOAS)。將Web應用看作是一個由很多狀態(應用狀態)組成的有限狀態機。資源之間通過超連結相互關聯,超連結既代表資源之間的關係,也代表可執行的狀態遷移。在超媒體之中不僅僅包含資料,還包含了狀態遷移的語義。以超媒體作為引擎,驅動Web應用的狀態遷移。通過超媒體暴露出伺服器所提供的資源,伺服器提供了哪些資源是在執行時通過解析超媒體發現的,而不是事先定義的。從面向服務的角度看,超媒體定義了伺服器所提供服務的協議。客戶端應該依賴的是超媒體的狀態遷移語義,而不應該對於是否存在某個URI或URI的某種特殊構造方式作出假設。一切都有可能變化,只有超媒體的狀態遷移語義能夠長期保持穩定。

通過對以上5個關鍵的理解,就可知道REST具有以下特徵:面向資源(Resource Oriented)、可定址(Addressability)、連通性(Connectedness)、無狀態(Statelessness)、統一介面(Uniform Interface)、超文字驅動(Hypertext Driven)。

從面向實用的角度來看,REST架構風格可以為Web開發者帶來三方面的利益:

  • 簡單性

採用REST架構風格,對於開發、測試、運維人員來說,都會更簡單。可以充分利用大量HTTP伺服器端和客戶端開發庫、Web功能測試/效能測試工具、HTTP快取、HTTP代理伺服器、防火牆。這些開發庫和基礎設施早已成為了日常用品,不需要什麼火箭科技(例如神奇昂貴的應用伺服器、中介軟體)就能解決大多數可伸縮性方面的問題。

  • 可伸縮性

充分利用好通訊鏈各個位置的HTTP快取元件,可以帶來更好的可伸縮性。其實很多時候,在Web前端做效能優化,產生的效果不亞於僅僅在伺服器端做效能優化,但是HTTP協議層面的快取常常被一些資深的架構師完全忽略掉。

  • 鬆耦合

統一介面+超文字驅動,帶來了最大限度的鬆耦合。允許伺服器端和客戶端程式在很大範圍內,相對獨立地進化。對於設計面向企業內網的API來說,鬆耦合並不是一個很重要的設計關注點。但是對於設計面向網際網路的API來說,鬆耦合變成了一個必選項,不僅在設計時應該關注,而且應該放在最優先位置。

總結

    REST是一種指導規則,而RESTful是符合REST結構設計的API。

以下是參考的文章: