1. 什么是REST
REST是REpresentational State Transfer的縮寫,來源于R. Fielding的一篇博士論文:《Architectural Styles and the Design of Network-based Software Architectures
》。REST不是什么規(guī)范,而是一種架構(gòu),一種網(wǎng)絡(luò)應(yīng)用的架構(gòu)。可以把REST理解成一種設(shè)計(jì)模式,就像其他設(shè)計(jì)模式一樣,只不過REST這種設(shè)計(jì)模式是應(yīng)用在網(wǎng)絡(luò)應(yīng)用架構(gòu)上的。
1.1 REST的含義
為了進(jìn)一步理解什么是REST,讓我們看看REpresentational State Transfer這三個(gè)英文單詞分別表示什么意思:
中文直譯:代表的,表像的。如果把WEB服務(wù)器端中所有的東西(數(shù)據(jù))都看作是資源(Resource),那么呈現(xiàn)在用戶面前(客戶端)的就是資源的表像(Representation)。同一個(gè)資源可能有不同表像,例如一個(gè)人作為一個(gè)Resource,那么他的表像(Representation)可以是一張圖片(相片),也可以是一個(gè)XML描述的個(gè)人信息,等等。每一個(gè)資源都有自己的唯一標(biāo)識(shí)(URI)。
中文直譯:狀態(tài)。這個(gè)比較難理解。首先這個(gè)狀態(tài)是客戶端的狀態(tài),而不是服務(wù)器端的狀態(tài)(在REST中,服務(wù)器端應(yīng)該是無狀態(tài)的)。那么,把State和Representation聯(lián)系在一起(Representational State),可以理解成:每一個(gè)資源(Resource)在客戶端的表像(Representation)就是客戶端的一個(gè)狀態(tài)(State)。
中文直譯:轉(zhuǎn)移。當(dāng)用戶通過不同的URI訪問不同的資源時(shí),客戶端的表像(Representation)也會(huì)隨著變化,也就意味著客戶端的狀態(tài)變更(Transfer)了,連起來就是:Representational State Transfer。
1.2 REST架構(gòu)的特點(diǎn)
- REST是一種架構(gòu),而不是一個(gè)規(guī)范。
- REST是一種典型的Client-Server架構(gòu),但是強(qiáng)調(diào)瘦服務(wù)器端,服務(wù)器端只應(yīng)該處理跟數(shù)據(jù)有關(guān)的操作,所有有關(guān)顯示的工作都應(yīng)該放在客戶端。
- 在REST架構(gòu)中,服務(wù)器是無狀態(tài)的,也就是說服務(wù)器不會(huì)保存任何與客戶端的會(huì)話狀態(tài)信息。所有的狀態(tài)信息只能放在雙方溝通的Message(消息)中。
- REST架構(gòu)是冪等的,對(duì)于相同的請(qǐng)求,服務(wù)器返回的結(jié)果也是相同的,因此服務(wù)器端返回的結(jié)果是可以緩存的,既可以存在客戶端也可以存在代理服務(wù)器端。
- 在REST架構(gòu)中,所有的操作都是基于統(tǒng)一的方式進(jìn)行的:
- 每個(gè)Resource都有一個(gè)唯一的標(biāo)識(shí)。
- 通過Representation(客戶端)來處理Resource(服務(wù)器端)。也就是說,客戶端不能直接操作服務(wù)器端的Resource,只能通過對(duì)相應(yīng)的Representation的操作,并發(fā)送相應(yīng)的請(qǐng)求,最后由服務(wù)器端來處理Resource并返回結(jié)果。
- 客戶端和服務(wù)器端傳送的任何一個(gè)Message(消息),都應(yīng)該是自描述的。也就是說處理這個(gè)Message所需要的上下文環(huán)境都應(yīng)該包含在這個(gè)Message當(dāng)中。
- 多媒體的交互系統(tǒng),客戶端和服務(wù)器端傳送的內(nèi)容可以是文檔,圖片,聲音等等多媒體數(shù)據(jù),這也是一個(gè)Resource能夠?qū)?yīng)不同的Representation(例如文檔,圖片等)的基礎(chǔ)。
- 分層結(jié)構(gòu),像TCP/IP的分層結(jié)構(gòu)一樣,第n層使用第n-1層提供的服務(wù)并為第n+1層提供服務(wù)。在REST中,Client-Server之間加入了Proxy層和Gateway層。在這些中間層可以加入一些業(yè)務(wù)處理以外的功能,譬如:負(fù)載均衡,安全控制等等。
- Code-On-Demand,客戶端可以訪問服務(wù)器端的Resource,但并不知道如何處理服務(wù)器端返回的結(jié)果,這個(gè)處理過程的代碼應(yīng)該是從服務(wù)器端發(fā)送過來,然后在客戶端執(zhí)行,也就是說客戶端的功能是根據(jù)需要?jiǎng)討B(tài)從服務(wù)器端獲得的。一個(gè)很簡單的例子,Applet就是從服務(wù)器端下載然后在客戶端執(zhí)行的。注意,這個(gè)特性是可選的(Optional),也就是說在你的REST實(shí)現(xiàn)當(dāng)中,可以不考慮這個(gè)特性。
REST架構(gòu)風(fēng)格是全新的針對(duì)Web應(yīng)用的開發(fā)風(fēng)格,是當(dāng)今世界最成功的互聯(lián)網(wǎng)超媒體分布式系統(tǒng)架構(gòu),它使得人們真正理解了Http協(xié)議本來面貌。隨著REST架構(gòu)成為主流技術(shù),一種全新的互聯(lián)網(wǎng)網(wǎng)絡(luò)應(yīng)用開發(fā)的思維方式開始流行。
一、REST是什么
REST是英文Representational State Transfer的縮寫,中文翻譯為“表述性狀態(tài)轉(zhuǎn)移”,他是由Roy Thomas Fielding博士在他的論文 《Architectural Styles and the Design of Network-based Software Architectures》中提出的一個(gè)術(shù)語。REST本身只是為分布式超媒體系統(tǒng)設(shè)計(jì)的一種架構(gòu)風(fēng)格,而不是標(biāo)準(zhǔn)。
基于Web的架構(gòu),實(shí)際上就是各種規(guī)范的集合,這些規(guī)范共同組成了Web架構(gòu)。比如Http協(xié)議,比如客戶端服務(wù)器模式,這些都是規(guī)范。每當(dāng)我們?cè)谠幸?guī)范的基礎(chǔ)上增加新的規(guī)范,就會(huì)形成新的架構(gòu)。而REST正是這樣一種架構(gòu),他結(jié)合了一系列的規(guī)范,而形成了一種新的基于Web的架構(gòu)風(fēng)格。
傳統(tǒng)的Web應(yīng)用大都是B/S架構(gòu),它包括了如下一些規(guī)范 。
1.客戶-服務(wù)器:這種規(guī)范的提出,改善了用戶接口跨多個(gè)平臺(tái)的可移植性,并且通過簡化服務(wù)器組件,改善了系統(tǒng)的可伸縮性。最為關(guān)鍵的是通過分離用戶接口和數(shù)據(jù)存儲(chǔ)這兩個(gè)關(guān)注點(diǎn),使得不同用戶終端享受相同數(shù)據(jù)成為了可能。
2.無狀態(tài)性:無狀態(tài)性是在客戶-服務(wù)器約束的基礎(chǔ)上添加的又一層規(guī)范。他要求通信必須在本質(zhì)上是無狀態(tài)的,即從客戶到服務(wù)器的每個(gè)request都必須包含理解該request所必須的所有信息。這個(gè)規(guī)范改善了系統(tǒng)的可見性(無狀態(tài)性使得客戶端和服務(wù)器端不必保存對(duì)方的詳細(xì)信息,服務(wù)器只需要處理當(dāng)前request,而不必了解所有的request歷史),可靠性(無狀態(tài)性減少了服務(wù)器從局部錯(cuò)誤中恢復(fù)的任務(wù)量),可伸縮性(無狀態(tài)性使得服務(wù)器端可以很容易的釋放資源,因?yàn)榉?wù)器端不必在多個(gè)request中保存狀態(tài))。同時(shí),這種規(guī)范的缺點(diǎn)也是顯而易見得,由于不能將狀態(tài)數(shù)據(jù)保存在服務(wù)器上的共享上下文中,因此增加了在一系列request中發(fā)送重復(fù)數(shù)據(jù)的開銷,嚴(yán)重的降低了效率。
3.緩存:為了改善無狀態(tài)性帶來的網(wǎng)絡(luò)的低效性,我們填加了緩存約束。緩存約束允許隱式或顯式地標(biāo)記一個(gè)response中的數(shù)據(jù),這樣就賦予了客戶端緩存response數(shù)據(jù)的功能,這樣就可以為以后的request共用緩存的數(shù)據(jù),部分或全部的消除一部分交互,增加了網(wǎng)絡(luò)的效率。但是用于客戶端緩存了信息,也就同時(shí)增加了客戶端與服務(wù)器數(shù)據(jù)不一致的可能,從而降低了可靠性。
B/S架構(gòu)的優(yōu)點(diǎn)是其部署非常方便,但在用戶體驗(yàn)方面卻不是很理想。為了改善這種情況,我們引入了REST。
REST在原有的架構(gòu)上增加了三個(gè)新規(guī)范:統(tǒng)一接口、分層系統(tǒng)和按需代碼。
1.統(tǒng)一接口:REST架構(gòu)風(fēng)格的核心特征就是強(qiáng)調(diào)組件之間有一個(gè)統(tǒng)一的接口,這表現(xiàn)在REST世界里,網(wǎng)絡(luò)上所有的事物都被抽象為資源,而REST就是通過通用的鏈接器接口對(duì)資源進(jìn)行操作。這樣設(shè)計(jì)的好處是保證系統(tǒng)提供的服務(wù)都是解耦的,極大的簡化了系統(tǒng),從而改善了系統(tǒng)的交互性和可重用性。并且REST針對(duì)Web的常見情況做了優(yōu)化,使得REST接口被設(shè)計(jì)為可以高效的轉(zhuǎn)移大粒度的超媒體數(shù)據(jù),這也就導(dǎo)致了REST接口對(duì)其它的架構(gòu)并不是最優(yōu)的。
2.分層系統(tǒng):分層系統(tǒng)規(guī)則的加入提高了各種層次之間的獨(dú)立性,為整個(gè)系統(tǒng)的復(fù)雜性設(shè)置了邊界,通過封裝遺留的服務(wù),使新的服務(wù)器免受遺留客戶端的影響,這也就提高了系統(tǒng)的可伸縮性。
3.按需代碼:REST允許對(duì)客戶端功能進(jìn)行擴(kuò)展。比如,通過下載并執(zhí)行applet或腳本形式的代碼,來擴(kuò)展客戶端功能。但這在改善系統(tǒng)可擴(kuò)展性的同時(shí),也降低了可見性。所以它只是REST的一個(gè)可選的約束。
二、REST的設(shè)計(jì)準(zhǔn)則
REST架構(gòu)是針對(duì)Web應(yīng)用而設(shè)計(jì)的,其目的是為了降低開發(fā)的復(fù)雜性,提高系統(tǒng)的可伸縮性。REST提出了如下設(shè)計(jì)準(zhǔn)則:
1.網(wǎng)絡(luò)上的所有事物都被抽象為資源(resource);
2.每個(gè)資源對(duì)應(yīng)一個(gè)唯一的資源標(biāo)識(shí)符(resource identifier);
3.通過通用的連接器接口(generic connector interface)對(duì)資源進(jìn)行操作;
4.對(duì)資源的各種操作不會(huì)改變資源標(biāo)識(shí)符;
5.所有的操作都是無狀態(tài)的(stateless)。
REST中的資源所指的不是數(shù)據(jù),而是數(shù)據(jù)和表現(xiàn)形式的組合,比如“最新訪問的10位會(huì)員”和“最活躍的10為會(huì)員”在數(shù)據(jù)上可能有重疊或者完全相同,而由于他們的表現(xiàn)形式不同,所以被歸為不同的資源,這也就是為什么REST的全名是Representational State Transfer的原因。資源標(biāo)識(shí)符就是URI(Uniform Resource Identifier),不管是圖片,Word還是視頻文件,甚至只是一種虛擬的服務(wù),也不管你是xml格式,txt文件格式還是其它文件格式,全部通過URI對(duì)資源進(jìn)行唯一的標(biāo)識(shí)。
REST是基于Http協(xié)議的,任何對(duì)資源的操作行為都是通過Http協(xié)議來實(shí)現(xiàn)。以往的Web開發(fā)大多數(shù)用的都是Http協(xié)議中的GET和POST方法,對(duì)其他方法很少使用,這實(shí)際上是因?yàn)閷?duì)Http協(xié)議認(rèn)識(shí)片面的理解造成的。Http不僅僅是一個(gè)簡單的運(yùn)載數(shù)據(jù)的協(xié)議,而是一個(gè)具有豐富內(nèi)涵的網(wǎng)絡(luò)軟件的協(xié)議。他不僅僅能對(duì)互聯(lián)網(wǎng)資源進(jìn)行唯一定位,而且還能告訴我們?nèi)绾螌?duì)該資源進(jìn)行操作。Http把對(duì)一個(gè)資源的操作限制在4個(gè)方法以內(nèi):GET,POST,PUT和DELETE,這正是對(duì)資源CRUD操作的實(shí)現(xiàn)。由于資源和URI是一一對(duì)應(yīng)的,執(zhí)行這些操作的時(shí)候URI是沒有變化的,這和以往的Web開發(fā)有很大的區(qū)別。正由于這一點(diǎn),極大的簡化了Web開發(fā),也使得URI可以被設(shè)計(jì)成更為直觀的反映資源的結(jié)構(gòu),這種URI的設(shè)計(jì)被稱作RESTful的URI。這位開發(fā)人員引入了一種新的思維方式:通過URL來設(shè)計(jì)系統(tǒng)結(jié)構(gòu)。當(dāng)然了,這種設(shè)計(jì)方式對(duì)一些特定情況也是不適用的,也就是說不是所有的URI都可以RESTful的。
REST之所以可以提高系統(tǒng)的可伸縮性,就是因?yàn)樗笏械牟僮鞫际菬o狀態(tài)的。由于沒有了上下文(Context)的約束,做分布式和集群的時(shí)候就更為簡單,也可以讓系統(tǒng)更為有效的利用緩沖池(Pool)。并且由于服務(wù)器端不需要記錄客戶端的一系列訪問,也減少了服務(wù)器端的性能。
三、使用REST架構(gòu)
對(duì)于開發(fā)人員來說,關(guān)心的是如何使用REST架構(gòu),這里我們來簡單談?wù)勥@個(gè)問題。REST不僅僅是一種嶄新的架構(gòu),它帶來的更是一種全新的Web開發(fā)過程中的思維方式:通過URL來設(shè)計(jì)系統(tǒng)結(jié)構(gòu)。在REST中,所有的URL都對(duì)應(yīng)著資源,只要URL的設(shè)計(jì)是良好的,那么其呈現(xiàn)的系統(tǒng)結(jié)構(gòu)也就是良好的。這點(diǎn)和TDD(Test Driven Development)很相似,他是通過測(cè)試用例來設(shè)計(jì)系統(tǒng)的接口,每一個(gè)測(cè)試用例都表示一系列用戶的需求。開發(fā)人員不需要一開始就編寫功能,而只需要把需要實(shí)現(xiàn)的功能通過測(cè)試用例的形式表現(xiàn)出來即可。這個(gè)和REST中通過URL設(shè)計(jì)系統(tǒng)結(jié)構(gòu)的方式類似,我們只需要根據(jù)需求設(shè)計(jì)出合理地URL,這些URL不一定非要鏈接到指定的頁面或者完成一些行為,只要它們能夠直觀的表現(xiàn)出系統(tǒng)的用戶接口。根據(jù)這些URL,我們就可以方便的設(shè)計(jì)系統(tǒng)結(jié)構(gòu)。從REST架構(gòu)的概念上來看,所有能夠被抽象成資源的東西都可以被指定為一個(gè)URL,而開發(fā)人員所需要做的工作就是如何能把用戶需求抽象為資源,以及如何抽象的精確。因?yàn)閷?duì)資源抽象的越為精確,對(duì)REST的應(yīng)用來說就越好。這個(gè)和傳統(tǒng)MVC開發(fā)模式中基于Action的思想差別就非常大。設(shè)計(jì)良好的URL,不但對(duì)于開發(fā)人員來說可以更明確的認(rèn)識(shí)系統(tǒng)結(jié)構(gòu),對(duì)使用者來說也方便記憶和識(shí)別資源,因?yàn)閁RL足夠簡單和有意義。按照以往的設(shè)計(jì)模式,很多URL后面都是一堆參數(shù),對(duì)于使用者來說也是很不方便的。
既然REST這么好用,那么是不是所有的Web應(yīng)用都能采取此種架構(gòu)呢?答案是否定的。我們知道,直到現(xiàn)在為止,MVC(Model-View-Controller)模式依然是Web開發(fā)最普遍的模式,絕大多數(shù)的公司和開發(fā)人員都采取此種架構(gòu)來開發(fā)Web應(yīng)用,并且其思維方式也停留于此。MVC模式由數(shù)據(jù),視圖和控制器構(gòu)成,通過事件(Event)觸發(fā)Controller來改變Model和View。加上Webwork,Struts等開源框架的加入,MVC開發(fā)模式已經(jīng)相當(dāng)成熟,其思想根本就是基于Action來驅(qū)動(dòng)。從開發(fā)人員角度上來說,貿(mào)然接受一個(gè)新的架構(gòu)會(huì)帶來風(fēng)險(xiǎn),其中的不確定因素太多。并且REST新的思維方式是把所有用戶需求抽象為資源,這在實(shí)際開發(fā)中是比較難做到的,因?yàn)椴⒉皇撬械挠脩粜枨蠖寄鼙怀橄鬄橘Y源,這樣也就是說不是整個(gè)系統(tǒng)的結(jié)構(gòu)都能通過REST的來表現(xiàn)。所以在開發(fā)中,我們需要根據(jù)以上2點(diǎn)來在REST和MVC中做出選擇。我們認(rèn)為比較好的辦法是混用REST和MVC,因?yàn)檫@適合絕大多數(shù)的Web應(yīng)用開發(fā),開發(fā)人員只需要對(duì)比較容易能夠抽象為資源的用戶需求采取REST的開發(fā)模式,而對(duì)其它需求采取MVC開發(fā)即可。這里需要提到的就是ROR(Ruby on Rails)框架,這是一個(gè)基于Ruby語言的越來越流行的Web開發(fā)框架,它極大的提高了Web開發(fā)的速度。更為重要的是,ROR(從1.2版本起)框架是第一個(gè)引入REST做為核心思想的Web開發(fā)框架,它提供了對(duì)REST最好的支持,也是當(dāng)今最成功的應(yīng)用REST的Web開發(fā)框架。實(shí)際上,ROR的REST實(shí)現(xiàn)就是REST和MVC混用,開發(fā)人員采用ROR框架,可以更快更好的構(gòu)建Web應(yīng)用。
對(duì)開發(fā)人員來說,REST不僅僅在Web開發(fā)上貢獻(xiàn)了自己的力量,同時(shí)也讓我們學(xué)到了如何把軟件工程原則系統(tǒng)地應(yīng)用于對(duì)一個(gè)真實(shí)軟件的設(shè)計(jì)和評(píng)估上。
理解REST軟件架構(gòu)
一種思維方式影響了軟件行業(yè)的發(fā)展。REST軟件架構(gòu)是當(dāng)今世界上最成功的互聯(lián)網(wǎng)的超媒體分布式系統(tǒng)。它讓人們真正理解我們的網(wǎng)絡(luò)協(xié)議HTTP本來面貌。它正在成為網(wǎng)絡(luò)服務(wù)的主流技術(shù),同時(shí)也正在改變互聯(lián)網(wǎng)的網(wǎng)絡(luò)軟件開發(fā)的全新思維方式。AJAX技術(shù)和Rails框架把REST軟件架構(gòu)思想真正地在實(shí)際中很好表現(xiàn)出來。今天微軟也已經(jīng)應(yīng)用REST并且提出把我們現(xiàn)有的網(wǎng)絡(luò)變成為一個(gè)語義網(wǎng),這種網(wǎng)絡(luò)將會(huì)使得搜索更加智能化。
REST與HTTP協(xié)議
REST軟件架構(gòu)是由Roy Thomas Fielding博士在2000年首次提出的。他為我們描繪了開發(fā)基于互聯(lián)網(wǎng)的網(wǎng)絡(luò)軟件的藍(lán)圖。REST軟件架構(gòu)是一個(gè)抽象的概念,是一種為了實(shí)現(xiàn)這一互聯(lián)網(wǎng)的超媒體分布式系統(tǒng)的行動(dòng)指南。利用任何的技術(shù)都可以實(shí)現(xiàn)這種理念。而實(shí)現(xiàn)這一軟件架構(gòu)最著名的就是HTTP協(xié)議。通常我們把REST也寫作為REST/HTTP,在實(shí)際中往往把REST理解為基于HTTP的REST軟件架構(gòu),或者更進(jìn)一步把REST和HTTP看作為等同的概念。
今天,HTTP是互聯(lián)網(wǎng)上應(yīng)用最廣泛的計(jì)算機(jī)協(xié)議。HTTP不是一個(gè)簡單的運(yùn)載數(shù)據(jù)的協(xié)議,而是一個(gè)具有豐富內(nèi)涵的網(wǎng)絡(luò)軟件的協(xié)議。它不僅僅能夠?qū)τ诨ヂ?lián)網(wǎng)資源進(jìn)行唯一定位,而且還能告訴我們對(duì)于該資源進(jìn)行怎樣運(yùn)作。這也是REST軟件架構(gòu)當(dāng)中最重要的兩個(gè)理念。而REST軟件架構(gòu)理念是真正理解HTTP協(xié)議而形成的。有了REST軟件架構(gòu)理念出現(xiàn),才使得軟件業(yè)避免了對(duì)HTTP協(xié)議的片面理解。只有正確的理論指導(dǎo),才能避免在軟件開發(fā)的實(shí)際工作過程中少走彎路。
REST與URI(資源定位)
REST軟件架構(gòu)之所以是一個(gè)超媒體系統(tǒng),是因?yàn)樗梢园丫W(wǎng)絡(luò)上所有資源進(jìn)行唯一的定位,不管你的文件是圖片、文件Word還是視頻文件,也不管你的文件是txt文件格式、xml文件格式還是其它文本文件格式。它利用支持HTTP的TCP/IP協(xié)議來確定互聯(lián)網(wǎng)上的資源。
REST與CRUD原則
REST軟件架構(gòu)遵循了CRUD原則,該原則告訴我們對(duì)于資源(包括網(wǎng)絡(luò)資源)只需要四種行為:創(chuàng)建(Create)、獲取(Read)、更新(Update)和銷毀(DELETE)就可以完成對(duì)其操作和處理了。其實(shí)世界萬物都是遵循這一規(guī)律:生、變、見、滅。所以計(jì)算機(jī)世界也不例外。這個(gè)原則是源自于我們對(duì)于數(shù)據(jù)庫表的數(shù)據(jù)操作:insert(生)、select(見)、update(變)和delete(滅),所以有時(shí)候CRUD也寫作為RUDI,其中的I就是insert。這四個(gè)操作是一種原子操作,即一種無法再分的操作,通過它們可以構(gòu)造復(fù)雜的操作過程,正如數(shù)學(xué)上四則運(yùn)算是數(shù)字的最基本的運(yùn)算一樣。
REST與網(wǎng)絡(luò)服務(wù)
盡管在Java語言世界中網(wǎng)絡(luò)服務(wù)目前是以SOAP技術(shù)為主,但是REST將是是網(wǎng)絡(luò)服務(wù)的另一選擇,并且是真正意義上的網(wǎng)絡(luò)服務(wù)。基于REST思想的網(wǎng)絡(luò)服務(wù)不久的將來也會(huì)成為是網(wǎng)絡(luò)服務(wù)的主流技術(shù)。REST不僅僅把HTTP作為自己的數(shù)據(jù)運(yùn)輸協(xié)議,而且也作為直接進(jìn)行數(shù)據(jù)處理的工具。而當(dāng)前的網(wǎng)絡(luò)服務(wù)技術(shù)都需要使用其它手段來完成數(shù)據(jù)處理工作,它們完全獨(dú)立于HTTP協(xié)議來進(jìn)行的,這樣增加了大量的復(fù)雜軟件架構(gòu)設(shè)計(jì)工作。REST的思想充分利用了現(xiàn)有的HTTP技術(shù)的網(wǎng)絡(luò)能力。在德國電視臺(tái)上曾經(jīng)出現(xiàn)過一個(gè)這樣的五十萬歐元智力題:如何實(shí)現(xiàn)網(wǎng)絡(luò)服務(wù)才能充分利用現(xiàn)有的HTTP協(xié)議?該問題給出了四個(gè)答案:去問微軟;WSDL2.0/SOAP1.2;WS-Transfer;根本沒有。這個(gè)問題告訴我們HTTP并不是一個(gè)簡單的數(shù)據(jù)傳來傳去的協(xié)議,而是一個(gè)聰明的會(huì)表現(xiàn)自己的協(xié)議,這也許是REST = Representational State Transfer的真正含義。
實(shí)際上目前很多大公司已經(jīng)采用了REST技術(shù)作為網(wǎng)絡(luò)服務(wù),如Google、Amazon等。在Java語言中重要的兩個(gè)以SOAP技術(shù)開始的網(wǎng)絡(luò)服務(wù)框架XFire和Axis也把REST作為自己的另一種選擇。它們的新的項(xiàng)目分別是Apache CXF和Axis2。Java語言也制定關(guān)于REST網(wǎng)絡(luò)服務(wù)規(guī)范:JAX-RS: Java API for RESTful Web Services (JSR 311)。相信還會(huì)出現(xiàn)更多與REST相關(guān)的激動(dòng)人心的信息。
REST與AJAX技術(shù)
盡管AJAX技術(shù)的出現(xiàn)才不到兩年時(shí)間,但是AJAX技術(shù)遵循了REST的一些重要原則。AJAX技術(shù)充分利用了HTTP來獲取網(wǎng)絡(luò)資源并且實(shí)現(xiàn)了HTTP沒有的對(duì)于異步數(shù)據(jù)進(jìn)行傳輸?shù)墓δ堋JAX技術(shù)還使得軟件更好地實(shí)現(xiàn)分布性功能,在一個(gè)企業(yè)內(nèi)只要一個(gè)人下載了AJAX引擎,其它企業(yè)內(nèi)部的人員,就可以共享該資源了。AJAX技術(shù)遵守REST準(zhǔn)則的應(yīng)用程序中簡單和可伸縮的架構(gòu),凡是采用AJAX技術(shù)的頁面簡潔而又豐富,一個(gè)頁面表現(xiàn)了豐富多彩的形態(tài)。
AJAX技術(shù)還使用了一種不同于XML格式的JSON文件格式,這個(gè)意義在哪里呢?在REST軟件架構(gòu)下我們不能對(duì)于XML文件進(jìn)行序列化處理,這樣程序員必須要使用自己的XML綁定框架。而以序列化的JavaScript對(duì)象為基礎(chǔ)的JSON已經(jīng)獲得了廣泛認(rèn)可,它被認(rèn)為能以遠(yuǎn)比XML更好的方式來序列化和傳輸簡單數(shù)據(jù)結(jié)構(gòu),而且它更簡潔。這對(duì)REST是一個(gè)極大貢獻(xiàn)和補(bǔ)充。
當(dāng)前的網(wǎng)絡(luò)應(yīng)用軟件還違背了REST的“無狀態(tài)服務(wù)器”約束。REST服務(wù)器只知道自己的狀態(tài)。REST不關(guān)心客戶端的狀態(tài),客戶端的狀態(tài)自己來管理,這是AJAX技術(shù)的應(yīng)用之地。通過AJAX技術(shù),可以發(fā)揮有狀態(tài)網(wǎng)絡(luò)客戶機(jī)的優(yōu)勢(shì)。而REST的服務(wù)器關(guān)心的是從所有網(wǎng)絡(luò)客戶端發(fā)送到服務(wù)器操作的順序。這樣使得互聯(lián)網(wǎng)這樣一個(gè)巨大的網(wǎng)絡(luò)得到有序的管理。
REST與Rails框架
Ruby on Rails框架(簡稱Rails或者Rails框架)是一個(gè)基于Ruby語言的越來越流行的網(wǎng)絡(luò)應(yīng)用軟件開發(fā)框架。它提供了關(guān)于REST最好的支持,也是當(dāng)今應(yīng)用REST最成功的一個(gè)軟件開發(fā)框架。Rails框架(從版本1.2.x起)成為了第一個(gè)引入REST作為核心思想的主流網(wǎng)絡(luò)軟件開發(fā)框架。在Rails框架的充分利用了REST軟件架構(gòu)之后,人們更加堅(jiān)信REST的重要性和必要性。Rails利用REST軟件架構(gòu)思想對(duì)網(wǎng)絡(luò)服務(wù)也提供了一流的支持。從最直觀的角度看待REST,它是網(wǎng)絡(luò)服務(wù)最理想的手段,但是Rails框架把REST帶到了網(wǎng)絡(luò)應(yīng)用軟件開發(fā)框架。這是一次飛躍,讓REST的思想從網(wǎng)絡(luò)服務(wù)的應(yīng)用提升到了網(wǎng)絡(luò)應(yīng)用軟件開發(fā)。利用REST思想的simply_restful插件已經(jīng)成為了Rails框架的核心內(nèi)容。
REST安全性
我們把現(xiàn)有基于SOAP的網(wǎng)絡(luò)服務(wù)和基于REST/HTTP網(wǎng)絡(luò)服務(wù)作個(gè)比喻,前者是一種傳統(tǒng)的寄信方式,而后者是現(xiàn)代網(wǎng)絡(luò)的電子郵件方式。要是是寄信和電子郵件都有病毒存在的話,傳統(tǒng)的寄信被送到對(duì)方就很危險(xiǎn),而電子郵件是開發(fā)的,電子郵件供應(yīng)商比如Google為我們檢查了電子郵件是否有病毒。這里并不是說明SOAP網(wǎng)絡(luò)服務(wù)消息包含義病毒,而是說明HTTP是無法處理SOAP信息包究竟好不好,需要額外的軟件工具解決這一問題,包括防火墻也用不上和管不了。
REST/HTTP網(wǎng)絡(luò)服務(wù)的信息包可以被防火墻理解和控制。你可以按照操作和鏈接進(jìn)行過濾信息包,如你可以規(guī)定從外部來的只能讀取(GET操作)自己服務(wù)器的資源。這樣對(duì)于系統(tǒng)管理員而言使得軟件管理更為簡單。REST的安全性還可以利用傳輸安全協(xié)議SSL/TLS、基本和摘要式認(rèn)證(Basic und Digest Authentication)。除了這些REST自身的安全性功能外,還可以利用像基于信息的Web Services Security(JSR 155)作為REST不錯(cuò)的補(bǔ)充。
本博客為學(xué)習(xí)交流用,凡未注明引用的均為本人作品,轉(zhuǎn)載請(qǐng)注明出處,如有版權(quán)問題請(qǐng)及時(shí)通知。由于博客時(shí)間倉促,錯(cuò)誤之處敬請(qǐng)諒解,有任何意見可給我留言,愿共同學(xué)習(xí)進(jìn)步。