張 炎
中圖分類號:TP3文獻標識碼:A文章編號:1671-7597(2009)1010105-01
萬維網(World Wide Web)已經改變我們的生活方式,它不僅僅是一個超大的分布式應用它更是一個用于分布式計算的平臺。Web服務、mashup(注1)及Aj锨應用都把web作為平臺使用,而如今的Web服務卻忽視了Web賴以成功的重要性——簡單。本文通過用REST思想對已有的Web服務進行重構,thWeb服務回歸“Web”理念。
一、REST和面向資源架構
REST(REpresentational State Transfer)表示性狀態(tài)轉移,并不是—種架構,它更像—種評判架構的方法。Roy Fielding(注2)的博士論文很好的詮釋了這一點;面向資源架構(Resource-Oriented Architecture)(注3)正是把REST的最佳實踐提煉出來,成為一種高層REST式架構。讓我們輕易地構建優(yōu)雅的、符合設計用途的、融/kWeb的分布式應用,而不是僅僅構筑在Web之上的。
二、Web和Web服務
Web的基礎技術——HTTP應用協(xié)議,是一種基于文檔的協(xié)議,被用來設計傳輸記錄的??蛻舳苏埱驡Fr/hello.txt,服務器端相應Hello,world!就這么簡單。你連接到服務器,把文檔路徑給它,然后服務器把文檔內容返回給你。它被設計的那么簡單,簡單性轉化成強大的能力。
Web服務之間差別的形成,正是它們在兩個問題上做法有所不同。第一個問題:客戶端如何把自己的意圖表達給服務器,稱之為方法信息(met hod information)。第二個問題:客戶端告訴服務器對哪些數(shù)據(jù)進行操作,稱之為作用域信息(scoping information)。
三、RPC式架構
RPC式Web服務從客戶端收到充滿數(shù)據(jù)的信封,然后返回一個充滿數(shù)據(jù)的信封。方法信息和作用域信息都放在信封或者報頭里。
XML-RPC是最典型的RPC架構,它只暴露一個URI(端點),并且該URI只支持一種HTTP方法-POST方法。而采用SOAP的web服務也屬于RPC式架構,它只不過多了一層信封,這樣的大Web服務,使得HTTP成為一種用于傳輸龐大XML負載的協(xié)議,而真正描述信息在XML里,最終使服務變得太過復雜。難于調試。
四、REST式面向資源架構
REST式架構意味,方法信息都放在HTTP方法里面,這是統(tǒng)一接口原則。面向資源架構意味,作用域信息都放在URI里面,這是可尋址性原則。兩者結合起來是很強大的,通過HTTP請求的第一行就能基本了解客戶端打算做什么。
任何事物,只要有被引用的必要,它就是一個資源(Rosourse),比如一個文檔,數(shù)據(jù)庫中的一條記錄,或者是運行某個算法的結果。面向對象的標準設計方法是把系統(tǒng)分解一個個名詞,一個對象(Object)是(is)某個事物。在面向資源設計中,一個資源(Resource)是(is)某個事物。
如果一個web服務將其數(shù)據(jù)集有價值的東西作為資源發(fā)布出來,那么該應用是具有可尋址性的(addressability)。資源必須至少有一個URI的,這就是資源的地址。URI應具有描述性,給人以直覺上的關聯(lián),并且還要具有一定的良好結構,以便客戶端能夠自己構造URI來訪闖他們想訪問的資源。對于REST式Wob服務來說,他們暴露的URIs有無數(shù)個,而對于RPc式Web服務而言,暴露URI很少(往往只有一個)??蓪ぶ沸允荳eb應用最大的優(yōu)點,使客戶端靈活使用網站。
在REST式web服務里,有兩種狀態(tài):資源狀態(tài)和應用狀態(tài)。資源狀態(tài)是關于資源的信息,保存在服務器端,而且只能以表式(Representation)的形式發(fā)給客戶端。應用狀態(tài),即關于客戶端在應用中所處狀態(tài)的信息,它被保存在客戶端??蛻舳送ㄟ^PUT或POST請求里附加一個表示來對資源狀態(tài)進行處理,而服務器通過在響應客戶端的GET請求時附上表示來處理應用狀態(tài)這正是表示性狀態(tài)——轉移(Representational State Transfer,PEST)這個詞的由來。
客戶端與資源之間的所有交互,都是通過為數(shù)不多的幾個HTTP方法進行的。一個資源只暴露一個統(tǒng)一的接口(uniform interface),最多支持6種HTTP方法。統(tǒng)一接口的強大之處,并不在于它所暴露的具體方法,而在于它的統(tǒng)一性一大家用同樣的方法來處理所有事物。
統(tǒng)一接口意味著,在面向資源設計中也必須設計為資源。資源與資源之間的關系,也必須用資源來表示,如讀者(Reader)訂閱(subscribe)一個欄目(Column),讀者和欄目都是資源,但訂閱這個動作不屬于統(tǒng)一接口的方法,必須通過一個叫做訂閱(Subscription)對象連代表讀者和欄目之間的關系。這種關系對象是符合統(tǒng)一接口的,可以被創(chuàng)建,獲取,刪除。
五、REST式Web服務構建
下面將介紹構建REST式面向資源架構Web服務的一般性步驟(注4);
1規(guī)劃數(shù)據(jù)集
2把數(shù)據(jù)集劃分為資源,對于其中每種資源
3用URI為該資源命名
4,暴露一個統(tǒng)一接口的子集
5設計來自客戶端的表示
6設計發(fā)給客戶端的表示
7用超級鏈接和表單把該資源與已有資源聯(lián)系起來
8考慮事件經過和可能出現(xiàn)的錯誤
六、總結
至此,REST讓我們認識到Web簡單的強大之處,Web服務領域就處在一條快速成為超級新秀的道路上。不過,它還沒完全迷失方向。對HTTP的再度重視正在興起,而且在REST的旗號下,HTTP顯示出了取代那些大公司試圖強加在人們頭上的技術的相當實力;REST是一套簡單的原則,開發(fā)者們可以根據(jù)這些原則按貼近web的方式來把應用連接起來。