|
英文原文:A Brief Introduction to REST
作者:Stefan Tilkov ,譯者:苑永凱,發(fā)布于 2007-12-25
不知你是否意識(shí)到,圍繞著什么才是實(shí)現(xiàn)異構(gòu)的應(yīng)用到應(yīng)用通信的“正確”方式,一場(chǎng)爭(zhēng)論正進(jìn)行的如火如荼:雖然當(dāng)前主流的方式明顯地集中在基于SOAP、WSDL和WS-*規(guī)范的Web Services領(lǐng)域,但也有少數(shù)人用細(xì)小但洪亮的聲音主張說(shuō)更好的方式是REST,表述性狀態(tài)轉(zhuǎn)移(REpresentational State Transfer)的簡(jiǎn)稱。在本文中,我不會(huì)涉及爭(zhēng)論的話題,而是嘗試對(duì)REST和RESTful HTTP應(yīng)用集成做實(shí)用性的介紹。以我的經(jīng)驗(yàn),有些話題一旦觸及就會(huì)引來(lái)眾多的討論,當(dāng)涉及到這方面話題的時(shí)候,我會(huì)深入詳細(xì)地闡述。
REST關(guān)鍵原則
大部分對(duì)REST的介紹是以其正式的定義和背景作為開(kāi)場(chǎng)的。但這兒且先按下不表,我先提出一個(gè)簡(jiǎn)單扼要的定義:REST定義了應(yīng)該如何正確地使用(這和大多數(shù)人的實(shí)際使用方式有很大不同)Web標(biāo)準(zhǔn),例如HTTP和URI。如果你在設(shè)計(jì)應(yīng)用程序時(shí)能堅(jiān)持REST原則,那就預(yù)示著你將會(huì)得到一個(gè)使用了優(yōu)質(zhì)Web架構(gòu)(這將讓你受益)的系統(tǒng)。總之,五條關(guān)鍵原則列舉如下:
- 為所有“事物”定義ID
- 將所有事物鏈接在一起
- 使用標(biāo)準(zhǔn)方法
- 資源多重表述
- 無(wú)狀態(tài)通信
下面讓我們進(jìn)一步審視這些原則。
為所有“事物”定義ID
在這里我使用了“事物”來(lái)代替更正式準(zhǔn)確的術(shù)語(yǔ)“資源”,因?yàn)橐粭l如此簡(jiǎn)單的原則,不應(yīng)該被淹沒(méi)在術(shù)語(yǔ)當(dāng)中。思考一下人們構(gòu)建的系統(tǒng),通常會(huì)找到一系列值得被標(biāo)識(shí)的關(guān)鍵抽象。每個(gè)事物都應(yīng)該是可標(biāo)識(shí)的,都應(yīng)該擁有一個(gè)明顯的ID——在Web中,代表ID的統(tǒng)一概念是:URI。URI構(gòu)成了一個(gè)全局命名空間,使用URI標(biāo)識(shí)你的關(guān)鍵資源意味著它們獲得了一個(gè)唯一、全局的ID。
對(duì)事物使用一致的命名規(guī)則(naming scheme)最主要的好處就是你不需要提出自己的規(guī)則——而是依靠某個(gè)已被定義,在全球范圍中幾乎完美運(yùn)行,并且能被絕大多數(shù)人所理解的規(guī)則。想一下你構(gòu)建的上一個(gè)應(yīng)用(假設(shè)它不是采用RESTful方式構(gòu)建的)中的任意一個(gè)高級(jí)對(duì)象(high-level object),那就很有可能看到許多從使用唯一標(biāo)識(shí)中受益的用例。比如,如果你的應(yīng)用中包含一個(gè)對(duì)顧客的抽象,那么我可以相當(dāng)肯定,用戶會(huì)希望將一個(gè)指向某個(gè)顧客的鏈接,能通過(guò)電子郵件發(fā)送到同事那里,或者加入到瀏覽器的書簽中,甚至寫到紙上。更透徹地講:如果在一個(gè)類似于Amazon.com的在線商城中,沒(méi)有用唯一的ID(一個(gè)URI)標(biāo)識(shí)它的每一件商品,可想而知這將是多么可怕的業(yè)務(wù)決策。
當(dāng)面對(duì)這個(gè)原則時(shí),許多人驚訝于這是否意味著需要直接向外界暴露數(shù)據(jù)庫(kù)記錄(或者數(shù)據(jù)庫(kù)記錄ID)——自從多年以來(lái)面向?qū)ο蟮膶?shí)踐告誡我們,要將持久化的信息作為實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái)之后,哪怕是剛有點(diǎn)想法都常會(huì)使人驚恐。但是這條原則與隱藏實(shí)現(xiàn)細(xì)節(jié)兩者之間并沒(méi)有任何沖突:通常,值得被URI標(biāo)識(shí)的事物——資源——要比數(shù)據(jù)庫(kù)記錄抽象的多。例如,一個(gè)定單資源可以由定單項(xiàng)、地址以及許多其它方面(可能不希望作為單獨(dú)標(biāo)識(shí)的資源暴露出來(lái))組成。標(biāo)識(shí)所有值得標(biāo)識(shí)的事物,領(lǐng)會(huì)這個(gè)觀念可以進(jìn)一步引導(dǎo)你創(chuàng)造出在傳統(tǒng)的應(yīng)用程序設(shè)計(jì)中不常見(jiàn)的資源:一個(gè)流程或者流程步驟、一次銷售、一次談判、一份報(bào)價(jià)請(qǐng)求——這都是應(yīng)該被標(biāo)識(shí)的事物的示例。同樣,這也會(huì)導(dǎo)致創(chuàng)建比非RESTful設(shè)計(jì)更多的持久化實(shí)體。
下面是一些你可能想到的URI的例子:
http://example.com/customers/1234
http://example.com/orders/2007/10/776654
http://example.com/products/4554
http://example.com/processes/salary-increase-234
正如我選擇了創(chuàng)建便于閱讀的URI——這是個(gè)有用的觀點(diǎn),盡管不是RESTful設(shè)計(jì)所必須的——應(yīng)該能十分容易地推測(cè)出URI的含義:它們明顯地標(biāo)識(shí)著單一“數(shù)據(jù)項(xiàng)”。但是再往下看:
http://example.com/orders/2007/11
http://example.com/products?color=green
首先,這兩個(gè)URI看起來(lái)與之前的稍有不同——畢竟,它們不是對(duì)一件事物的標(biāo)識(shí),而是對(duì)一類事物集合的標(biāo)識(shí)(假定第一個(gè)URI標(biāo)識(shí)了所有在2007年11月份提交的定單,第二個(gè)則是綠顏色產(chǎn)品的集合)。但是這些集合自身也是事物(資源),也應(yīng)該被標(biāo)識(shí)。
注意,使用唯一、全局統(tǒng)一的命名規(guī)則的好處,既適用于瀏覽器中的Web應(yīng)用,也適用于機(jī)對(duì)機(jī)(machine-to-machine,m2m)通信。
來(lái)對(duì)第一個(gè)原則做下總結(jié):使用URI標(biāo)識(shí)所有值得標(biāo)識(shí)的事物,特別是應(yīng)用中提供的所有“高級(jí)”資源,無(wú)論這些資源代表單一數(shù)據(jù)項(xiàng)、數(shù)據(jù)項(xiàng)集合、虛擬亦或?qū)嶋H的對(duì)象還是計(jì)算結(jié)果等。
將所有事物鏈接在一起
接下來(lái)要討論的原則有一個(gè)有點(diǎn)令人害怕的正式描述:“超媒體被當(dāng)作應(yīng)用狀態(tài)引擎(Hypermedia as the engine of application state)”,有時(shí)簡(jiǎn)寫為HATEOAS。(嚴(yán)格地說(shuō),這不是我說(shuō)的。)這個(gè)描述的核心是超媒體概念,換句話說(shuō):是鏈接的思想。鏈接是我們?cè)贖TML中常見(jiàn)的概念,但是它的用處絕不局限于此(用于人們網(wǎng)絡(luò)瀏覽)。考慮一下下面這個(gè)虛構(gòu)的XML片段:
<order self="http://example.com/customers/1234"> <amount>23</amount> <product ref="http://example.com/products/4554"> <customer ref="http://example.com/customers/1234"></customer> </product></order>
it知識(shí)庫(kù):深入淺出REST,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。