REST架構

   秋名山上行人稀,學習還得靠本身!

 

 開始學習REST,總結下學習筆記,以便之後用得着!有錯誤之處,但願留言交流(2576731178@qq.com)!javascript

1、Web技術與REST的關係

想要更好理解REST,須要準備下Web相關知識。css

從技術架構層面上看,Web的技術架構包括了四個基石:html

  • URI(URL)【resource】前端

  • HTTP (應用層協議)java

  • HyperText(除了HTML外,也能夠是帶有超連接的XML或JSON)數據庫

  • MIME=> text/html // text/css //text/javascript image/png編程

在這四個基石之上,Web開發技術的發展能夠粗略劃分紅如下幾個階段:瀏覽器

    1.靜態內容階段:在此最初的階段,Web由大量的靜態HTML文檔組成。Web服務器能夠被看做是支持超文本的共享文件服務器。緩存

    2.CGI程序階段:在此階段,Web服務器經過CGI(Common Gateway Interface)協議與應用程序之間的通訊,應用程序被稱做CGI程序(Web服務器增長了一些編程API,能夠向客戶端提供一些動態變化的內容)。安全

    3.腳本語言階段:在此階段,服務器端出現了ASP、PHP、JSP、ColdFusion等支持session的腳本語言技術,瀏覽器端出現了Java Applet、JavaScript等技術。

    4.瘦客戶端應用階段:在此階段,在服務器端出現了獨立於Web服務器的應用服務器,出現了Web MVC開發模式,服務器端生成所有的動態內容,基於這些框架開發的Web應用,一般都是瘦客戶端應用。SSH => SSM => SpringBoot

    5.RIA應用階段:在此階段,應用多種RIA(Rich Internet Application)技術,大幅改善用戶體驗。應用最爲普遍的RIA技術是DHTML+Ajax。同時誕生了大量的Web前端DHTML開發庫,例如Prototype、Dojo、ExtJS、jQuery/jQuery UI等等

    6.移動Web應用階段:在此階段,出現了大量面向移動設備的Web應用開發技術。除了Android、iOS、Windows Phone等操做系統平臺原生的開發技術以外,基於HTML5的開發技術也變得很是流行。

   Web發展到了1995年,在CGI、ASP等技術出現以後,沿用了多年、主要面向靜態文檔的HTTP/1.0協議已經沒法知足Web應用的開發需求,所以須要設計新版本的HTTP協議。在HTTP/1.0協議專家組之中,有一位年輕人脫穎而出,顯示出了不凡的洞察力,後來他成爲了HTTP/1.1協議專家組的負責人。這位年輕人就是Apache HTTP服務器的核心開發者羅伊·菲爾丁(Roy Fielding),他仍是Apache軟件基金會的合做創始人。

       羅伊·菲爾丁和他的同事們在HTTP/1.1協議的設計工做中,對於Web在技術架構方面的因素作了一番深刻的總結。Fielding將這些總結歸入到了一套理論框架之中,而後使用這套理論框架中的指導原則,來指導HTTP/1.1協議的設計方向。HHTTP/1.1協議設計的極爲成功。Fielding在完成HTTP/1.1協議的設計工做以後,回到了加州大學歐文分校繼續攻讀本身的博士學位。第二年(2000年)在他的博士學位論文Architectural Styles and the Design of Network-based Software Architectures中,Fielding更爲系統、嚴謹地闡述了這套理論框架,而且使用這套理論框架推導出了一種新的架構風格,而且爲這種架構風格取了一個使人輕鬆愉快的名字「REST」——Representational State Transfer(表述性狀態轉移)的縮寫。    

       在Fielding的這篇名爲Architectural Styles and the Design of Network-based Software Architectures的博士論文(中文版名爲《架構風格與基於網絡的軟件架構設計》)中,提出了一整套基於網絡的軟件(即所謂的「分佈式應用」)的設計方法,值得全部分佈式應用的開發者仔細閱讀、深刻體會。

    REST架構風格最重要的架構約束有6個:

  (1)客戶-服務器(Client-Server)

          通訊只能由客戶端單方面發起,表現爲請求-響應的形式。

  (2)無狀態(Stateless)

          通訊的會話狀態(Session State)應該所有由客戶端負責維護。

  (3)緩存(Cache)

          響應內容能夠在通訊鏈的某處被緩存,以改善網絡效率。

  (4)統一接口(Uniform Interface)

          通訊鏈的組件之間經過統一的接口相互通訊,以提升交互的可見性。

  (5)分層系統(Layered System)

          經過限制組件的行爲(即,每一個組件只能「看到」與其交互的緊鄰層),將架構分解爲若干等級的層。

  (6)按需代碼(Code-On-Demand,可選)

          支持經過下載並執行一些代碼(例如Java Applet、Flash或JavaScript),對客戶端的功能進行擴展。

 2、REST詳解

REST到底是什麼?

      REST是HTTP/1.1協議等Web規範的設計指導原則

首先,REST是Web自身的架構風格。

REST也是Web之因此取得成功的技術架構方面因素的總結。REST是世界上最成功的分佈式應用架構風格。它是爲 運行在互聯網環境 的 分佈式 超媒體系統量身定製的。

互聯網環境與企業內網環境有很是大的差異,最主要的差異是兩個方面:

  • 可伸縮性需求沒法控制:併發訪問量或暴漲或暴跌。

  • 安全性需求沒法控制:沒法控制客戶端發來的請求的格式,極可能會是惡意的請求。

而所謂的「超媒體系統」,即,使用了超文本的系統。能夠把「超媒體」理解爲超文本+媒體內容。

REST是HTTP/1.1協議等Web規範的設計指導原則,HTTP/1.1協議正是爲實現REST風格的架構而設計的。新的Web規範,其設計必須符合REST的要求,不然整個Web的體系架構會由於引入嚴重矛盾而崩潰。

總結爲一句話:REST是全部Web應用都應該遵照的架構設計指導原則。既是指導原則,因此不具備強制性,可是違反了REST的指導原則,會付出不少代價,特別是對於大流量的網站而言。

要深刻理解REST,須要理解REST的五個關鍵詞:

  1. 資源(Resource)

  2. 資源的表述(Representation)

  3. 狀態轉移(State Transfer)

  4. 統一接口(Uniform Interface)

  5. 超文本驅動(Hypertext Driven)

 

什麼是資源?

資源是一種看待服務器的方式,即,將服務器看做是由不少離散的資源組成。每一個資源是服務器上一個可命名的抽象概念。由於資源是一個抽象的概念,因此它不只僅能表明服務器文件系統中的一個文件、數據庫中的一張表等等具體的東西,能夠將資源設計的要多抽象有多抽象,只要想象力容許並且客戶端應用開發者可以理解。與面向對象設計相似,資源是以名詞爲核心來組織的,首先關注的是名詞。一個資源能夠由一個或多個URI來標識。URI既是資源的名稱,也是資源在Web上的地址。對某個資源感興趣的客戶端應用,能夠經過資源的URI與其進行交互。(註解:拿來用的東西)

什麼是資源的表述?

資源的表述是一段對於資源在某個特定時刻的狀態的描述。能夠在客戶端-服務器端之間轉移(交換)。資源的表述能夠有多種格式,例如HTML/XML/JSON/純文本/圖片/視頻/音頻等等。資源的表述格式能夠經過協商機制來肯定。請求-響應方向的表述一般使用不一樣的格式。

什麼是狀態轉移?

狀態轉移(state transfer)與狀態機中的狀態遷移(state transition)的含義是不一樣的。狀態轉移說的是:在客戶端和服務器端之間轉移(transfer)表明資源狀態的表述。經過轉移和操做資源的表述,來間接實現操做資源的目的。

什麼是統一接口?

REST要求,必須經過統一的接口來對資源執行各類操做。對於每一個資源只能執行一組有限的操做。以HTTP/1.1協議爲例,HTTP/1.1協議定義了一個操做資源的統一接口,主要包括如下內容:

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

  • HTTP頭信息(可自定義)

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

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

  • 一套標準的緩存機制

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

REST還要求,對於資源執行的操做,其操做語義必須由HTTP消息體以前的部分徹底表達,不能將操做語義封裝在HTTP消息體內部。這樣作是爲了提升交互的可見性,以便於通訊鏈的中間組件實現緩存、安全審計等等功能。

什麼是超文本驅動?

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

相關文章
相關標籤/搜索