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