<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    走在架構(gòu)師的大道上 Jack.Wang's home

    Java, C++, linux c, C#.net 技術(shù),軟件架構(gòu),領(lǐng)域建模,IT 項(xiàng)目管理 Dict.CN 在線詞典, 英語學(xué)習(xí), 在線翻譯

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks

    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è)英文單詞分別表示什么意思:

    • Representational

    中文直譯:代表的,表像的。如果把WEB服務(wù)器端中所有的東西(數(shù)據(jù))都看作是資源(Resource),那么呈現(xiàn)在用戶面前(客戶端)的就是資源的表像(Representation)。同一個(gè)資源可能有不同表像,例如一個(gè)人作為一個(gè)Resource,那么他的表像(Representation)可以是一張圖片(相片),也可以是一個(gè)XML描述的個(gè)人信息,等等。每一個(gè)資源都有自己的唯一標(biāo)識(shí)(URI)。

    • State

    中文直譯:狀態(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)。

    • Transfer

    中文直譯:轉(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 CXFAxis2。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)步。
    posted on 2008-05-15 18:47 Jack.Wang 閱讀(9724) 評(píng)論(3)  編輯  收藏 所屬分類: 開發(fā)技術(shù)

    Feedback

    # re: 淺談REST 2008-05-16 11:43 hmt
    > Http把對(duì)一個(gè)資源的操作限制在4個(gè)方法以內(nèi):GET,POST,PUT和DELETE,這正是對(duì)資源CRUD操作的實(shí)現(xiàn)。

    把HTTP當(dāng)成CRUD來使用,將無法發(fā)揮REST中"Hypermedia as application state engine"所帶來的好處。這是Roy Fielding一再強(qiáng)調(diào)的:

    http://tech.groups.yahoo.com/group/rest-discuss/message/10740  回復(fù)  更多評(píng)論
      

    # re: 淺談REST 2008-05-16 12:37 Jack.Wang
    There seems to be a common thread with most posts here. People
    have been busy modeling everything as a resource and now they
    want to know how to do everything in a PUT or DELETE instead of
    any of the other HTTP methods. That is wrong. That is thinking
    HTTP is just a "Save as..." dialog.

    REST is not limited to GET, PUT, and DELETE. Anyone who says so
    is just making things up as they go along. REST is limited to the
    client being told what to do next by the current state of where
    they are now, aside from the entry point(s) we call a bookmark.
    That is feasible because the set of methods is uniform, not because
    it is limited to CRUD. POST is an equal party in the REST interface,
    particularly when actions are being applied to the resources that
    are a composite of multiple source resources. So is PATCH.

    Doing RESTful actions on multiple resources is no different from
    selecting multiple tunes in iTunes and using the info dialog
    to set certain properties across all selected tunes. It is a UI issue.
    The UI builds a set of actions to perform and then performs them
    in whatever way is most efficiently provided by the set of resources
    being operated upon. If those resources (or, rather, the index to
    those resources) say they can be operated upon as a group by POST
    of a selection form, then so be it -- that is perfectly RESTful
    even without the benefit of per-resource cache invalidation.
    Likewise for PATCH or PUT to a meta-resource, or PROPPATCH to a
    WebDAV resource, it is RESTful if there is some engine described
    by a representation provided by the origin server that instructs
    the client on what to do next.

    The goals are to remove coupling and maximize the number of
    reusable resources.

    ....Roy  回復(fù)  更多評(píng)論
      

    # re: 淺談REST 2008-05-16 17:28 Jack.Wang
    我看過一些文檔,感覺 Web Service 還不太成熟,只能作為異構(gòu)系統(tǒng)之間相互集成時(shí)的膠水。以前 robbin 寫過介紹 Web Service 的文章對(duì) Web Service 的定位也基本上是這樣。Web Service 并不適合核心的業(yè)務(wù)領(lǐng)域,其組件模型相比 CORBA、EJB 來說是非常不成熟的。核心的應(yīng)用領(lǐng)域還是要靠 CORBA、EJB 來建造。
    基于 HTTP 只是一個(gè) Marketing Hype,不要上當(dāng)。CORBA 如果配置在 80 端口同樣可以穿越防火墻。HTTP 本身就是一個(gè)低效的傳輸協(xié)議,基于文本的 XML 更加低效,在高強(qiáng)度的核心應(yīng)用領(lǐng)域,不要跟我說性能是無關(guān)緊要的。另外還有安全性等 CORBA 已經(jīng)解決得很好的問題 Web Service 好象還沒有完全解決(是不是老黃歷了?)
    簡單的技術(shù)就應(yīng)該用在簡單的場合,一定要在復(fù)雜的核心應(yīng)用領(lǐng)域采用簡單的技術(shù)是會(huì)出問題的。CORBA 確實(shí)很復(fù)雜,但是要搞清楚究竟是因?yàn)橐鉀Q的問題本身很復(fù)雜所以技術(shù)也很復(fù)雜還是因?yàn)橐粠图夹g(shù)狂人閑的無聊故意搞得這么復(fù)雜以便大家對(duì)他們頂禮膜拜。
    我的看法是 Web Service 與 CORBA 的定位不同,所以不存在誰滅掉誰的問題。
    一點(diǎn)淺見,歡迎討論。  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲午夜无码久久久久| 99久久免费精品高清特色大片| 亚洲AV无码专区在线观看成人| 亚洲激情视频图片| 亚洲人成在久久综合网站| 亚洲网站视频在线观看| 亚洲综合图片小说区热久久| 亚洲欧洲日韩不卡| 久久亚洲AV无码精品色午夜| 亚洲免费闲人蜜桃| 亚洲综合伊人制服丝袜美腿| 亚洲五月综合网色九月色| 亚洲情A成黄在线观看动漫软件 | 亚洲国产午夜福利在线播放| 国产一区视频在线免费观看| 一本久到久久亚洲综合| 亚洲狠狠爱综合影院婷婷| 在线亚洲人成电影网站色www | 黄色片在线免费观看| 免费在线观看的网站| 在线免费一区二区| www亚洲一级视频com| 国产精品亚洲不卡一区二区三区| 亚洲一区二区三区影院| 亚洲激情在线视频| 亚洲娇小性色xxxx| 精品特级一级毛片免费观看| a毛片成人免费全部播放| 国产一区二区免费视频| 91成人免费观看网站| 国产精品va无码免费麻豆| 四虎精品亚洲一区二区三区| 亚洲精品无码午夜福利中文字幕| 亚洲国产老鸭窝一区二区三区| 亚洲国产夜色在线观看| 国产成人亚洲精品91专区高清 | 亚洲熟妇少妇任你躁在线观看| 男女污污污超污视频免费在线看| a毛片免费全部播放完整成| 最近的中文字幕大全免费8| 精品国产免费观看久久久|