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