javascript
想要更好理解REST,須要準備下Web相關知識。css
從技術架構層面上看,Web的技術架構包括了四個基石:html
URI(URL)【resource】前端
HTTP (應用層協議)java
HyperText(除了HTML外,也能夠是帶有超連接的XML或JSON)數據庫
MIME=> text/html // text/css //text/javascript image/png編程
瀏覽器
緩存
靜態內容階段:在此最初的階段,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發展到了1995年,在CGI、ASP等技術出現以後,沿用了多年、主要面向靜態文檔的HTTP/1.0協議已經沒法知足Web應用的開發需求,所以須要設計新版本的HTTP協議。在HTTP/1.0協議專家組之中,有一位年輕人脫穎而出,顯示出了不凡的洞察力,後來他成爲了HTTP/1.1協議專家組的負責人。這位年輕人就是Apache HTTP服務器的核心開發者羅伊·菲爾丁(Roy Fielding),他仍是Apache軟件基金會的合做創始人。
(1)客戶-服務器(Client-Server)
通訊只能由客戶端單方面發起,表現爲請求-響應的形式。
(2)無狀態(Stateless)
通訊的會話狀態(Session State)應該所有由客戶端負責維護。
(3)緩存(Cache)
響應內容能夠在通訊鏈的某處被緩存,以改善網絡效率。
(4)統一接口(Uniform Interface)
通訊鏈的組件之間經過統一的接口相互通訊,以提升交互的可見性。
(5)分層系統(Layered System)
經過限制組件的行爲(即,每一個組件只能「看到」與其交互的緊鄰層),將架構分解爲若干等級的層。
(6)按需代碼(Code-On-Demand,可選)
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的五個關鍵詞:
資源(Resource)
資源的表述(Representation)
狀態轉移(State Transfer)
統一接口(Uniform Interface)
超文本驅動(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的某種特殊構造方式做出假設。一切都有可能變化,只有超媒體的狀態遷移語義可以長期保持穩定。