2000年時 Roy Fielding 博士論文中提出REST架構(gòu)風(fēng)格(英文:Representational State Transfer,簡稱REST)

?論文地址:(?http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm)
REST架構(gòu)風(fēng)格最重要的架構(gòu)約束有6個:
客戶-服務(wù)器(Client-Server)
通信只能由客戶端單方面發(fā)起,表現(xiàn)為請求-響應(yīng)的形式。
無狀態(tài)(Stateless)
通信的會話狀態(tài)(Session State)應(yīng)該全部由客戶端負責(zé)維護。
緩存(Cache)
響應(yīng)內(nèi)容可以在通信鏈的某處被緩存,以改善網(wǎng)絡(luò)效率。
統(tǒng)一接口(Uniform Interface)
通信鏈的組件之間通過統(tǒng)一的接口相互通信,以提高交互的可見性。
分層系統(tǒng)(Layered System)
通過限制組件的行為(即,每個組件只能“看到”與其交互的緊鄰層),將架構(gòu)分解為若干等級的層。
按需代碼(Code-On-Demand,可選)
支持通過下載并執(zhí)行一些代碼(例如Java Applet、Flash或JavaScript),對客戶端的功能進行擴展。
要深入理解REST,需要理解REST的五個關(guān)鍵詞:
資源(Resource)
資源的表述(Representation)
狀態(tài)轉(zhuǎn)移(State Transfer)
統(tǒng)一接口(Uniform Interface)
超文本驅(qū)動(Hypertext Driven)
什么是資源?
資源是一種看待服務(wù)器的方式,即,將服務(wù)器看作是由很多離散的資源組成。每個資源是服務(wù)器上一個可命名的抽象概念。因為資源是一個抽象的概念,所以它不僅僅能代表服務(wù)器文件系統(tǒng)中的一個文件、數(shù)據(jù)庫中的一張表等等具體的東西,可以將資源設(shè)計的要多抽象有多抽象,只要想象力允許而且客戶端應(yīng)用開發(fā)者能夠理解。與面向?qū)ο笤O(shè)計類似,資源是以名詞為核心來組織的,首先關(guān)注的是名詞。一個資源可以由一個或多個URI來標(biāo)識。URI既是資源的名稱,也是資源在Web上的地址。對某個資源感興趣的客戶端應(yīng)用,可以通過資源的URI與其進行交互。
什么是資源的表述?
資源的表述是一段對于資源在某個特定時刻的狀態(tài)的描述??梢栽诳蛻舳?服務(wù)器端之間轉(zhuǎn)移(交換)。資源的表述可以有多種格式,例如HTML/XML/JSON/純文本/圖片/視頻/音頻等等。資源的表述格式可以通過協(xié)商機制來確定。請求-響應(yīng)方向的表述通常使用不同的格式。
什么是狀態(tài)轉(zhuǎn)移?
狀態(tài)轉(zhuǎn)移(state transfer)與狀態(tài)機中的狀態(tài)遷移(state transition)的含義是不同的。狀態(tài)轉(zhuǎn)移說的是:在客戶端和服務(wù)器端之間轉(zhuǎn)移(transfer)代表資源狀態(tài)的表述。通過轉(zhuǎn)移和操作資源的表述,來間接實現(xiàn)操作資源的目的。
什么是統(tǒng)一接口?
REST要求,必須通過統(tǒng)一的接口來對資源執(zhí)行各種操作。對于每個資源只能執(zhí)行一組有限的操作。以HTTP/1.1協(xié)議為例,HTTP/1.1協(xié)議定義了一個操作資源的統(tǒng)一接口,主要包括以下內(nèi)容:
7個HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS
HTTP頭信息(可自定義)
HTTP響應(yīng)狀態(tài)代碼(可自定義)
一套標(biāo)準(zhǔn)的內(nèi)容協(xié)商機制
一套標(biāo)準(zhǔn)的緩存機制
一套標(biāo)準(zhǔn)的客戶端身份認(rèn)證機制
REST還要求,對于資源執(zhí)行的操作,其操作語義必須由HTTP消息體之前的部分完全表達,不能將操作語義封裝在HTTP消息體內(nèi)部。這樣做是為了提高交互的可見性,以便于通信鏈的中間組件實現(xiàn)緩存、安全審計等等功能。
什么是超文本驅(qū)動?
“超文本驅(qū)動”又名“將超媒體作為應(yīng)用狀態(tài)的引擎”(Hypermedia As The Engine Of Application State,來自Fielding博士論文中的一句話,縮寫為HATEOAS)。將Web應(yīng)用看作是一個由很多狀態(tài)(應(yīng)用狀態(tài))組成的有限狀態(tài)機。資源之間通過超鏈接相互關(guān)聯(lián),超鏈接既代表資源之間的關(guān)系,也代表可執(zhí)行的狀態(tài)遷移。在超媒體之中不僅僅包含數(shù)據(jù),還包含了狀態(tài)遷移的語義。以超媒體作為引擎,驅(qū)動Web應(yīng)用的狀態(tài)遷移。通過超媒體暴露出服務(wù)器所提供的資源,服務(wù)器提供了哪些資源是在運行時通過解析超媒體發(fā)現(xiàn)的,而不是事先定義的。從面向服務(wù)的角度看,超媒體定義了服務(wù)器所提供服務(wù)的協(xié)議。客戶端應(yīng)該依賴的是超媒體的狀態(tài)遷移語義,而不應(yīng)該對于是否存在某個URI或URI的某種特殊構(gòu)造方式作出假設(shè)。一切都有可能變化,只有超媒體的狀態(tài)遷移語義能夠長期保持穩(wěn)定。
要定義嚴(yán)謹(jǐn)?shù)腞EST的統(tǒng)一接口,就需要真正理解HTTP方法的冪等性
安全性:代表安全的REST的接口,是指外系統(tǒng)對該接口的訪問,不會使服務(wù)器端資源的狀態(tài)發(fā)生改變。
冪等性:冪等性是指外系統(tǒng)對同一REST接口的多次訪問,得到的資源是相同的。
restful架構(gòu)個人總結(jié):(白話)
看Url就知道要什么
看http method就知道干什么
看http status code就知道結(jié)果如何
最常見的一種設(shè)計錯誤,就是URI包含動詞。
因為"資源"表示一種實體,所以應(yīng)該是名詞,URI不應(yīng)該有動詞,動詞應(yīng)該放在HTTP協(xié)議中。
HTTP動詞
GET? ? 獲取一個資源
POST? ? 添加一個資源
PUT? ? 修改一個資源
DELETE? 刪除一個資源