REST架構(gòu)風(fēng)格

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

Roy Fielding

?論文地址:(?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? 刪除一個資源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 更新版本已經(jīng)發(fā)表在我的新博客。 REST REST是Representational State Transfer...
    csRyan閱讀 2,735評論 1 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評論 19 139
  • 一說到REST,我想大家的第一反應(yīng)就是“啊,就是那種前后臺通信方式?!钡窃谝笤敿氈v述它所提出的各個約束,以及如...
    時待吾閱讀 3,595評論 0 19
  • REST本身是一個高度抽象化的架構(gòu)風(fēng)格,因而總是很難對它有一個比較深入且印象深刻的理解。寫這篇文章的目的,是自己對...
    vito1994閱讀 3,072評論 0 26
  • 壹。 我拖著行李慢慢地走在路上,我以為情節(jié)會像所有電視里演的那樣,一場傾盆大雨,讓我遍體淋濕。一直以為分手的時候,...
    磨嘰人閱讀 439評論 3 8

友情鏈接更多精彩內(nèi)容