我已經(jīng)向你展示了REST的能力,,但是還沒有系統(tǒng)地講述該能力是怎樣形成的,,以及如何來展現(xiàn)該能力。在這一章,,我將概述一個具體的REST式架構(gòu)——面向資源的架構(gòu)(Resource-Oriented Architecture,,ROA)。ROA是一種把實(shí)際問題轉(zhuǎn)換成REST式Web服務(wù)的方法:它令URI,、HTTP和XML具有跟其他Web應(yīng)用一樣的工作方式,,令程序員們?nèi)菀资褂盟鼈儭?br> 在第1章,我根據(jù)REST式Web服務(wù)(RESTful web services)在兩個問題上的不同做法來對它們進(jìn)行分類,。這兩個問題分別對應(yīng)于REST的四個標(biāo)志特征中的兩個,。 作用域信息(scoping information)(“服務(wù)器發(fā)送的為什么是這些數(shù)據(jù),,而不是其他數(shù)據(jù)”)——該信息是放在URI里的。這是可尋址性(addressability)原則,。 方法信息(method information)(“為什么服務(wù)器應(yīng)當(dāng)發(fā)送而不是刪除這些數(shù)據(jù),?”)——該信息是放在HTTP方法里的。HTTP方法只有少數(shù)幾種,,而且人人都事先知道這些方法的作用,。這是統(tǒng)一接口(uniform interface)原則。 在這一章,,我將介紹面向資源的架構(gòu)(ROA)的功能成分:資源,、資源名稱、資源的表示,、資源間的鏈接,。我將解釋并宣傳ROA的特性:可尋址性(addressability)、無狀態(tài)性(statelessness),、連通性(connectedness)和統(tǒng)一接口(uniform interface),。我將展示W(wǎng)eb技術(shù)(HTTP、URI和XML)是如何實(shí)現(xiàn)這些功能成分以獲得上述特性的,。 在前面幾章,,我通過現(xiàn)有的一些Web服務(wù)(如S3)舉例說明了一些概念。在本章,,我除了會引用一些現(xiàn)有的Web服務(wù)(webservices)以外,,還會引用一些現(xiàn)有的網(wǎng)站(web sites)來講解概念。希望此刻我已經(jīng)讓你相信“網(wǎng)站就是Web服務(wù),,而且許多Web應(yīng)用(比如搜索引擎)就是REST式Web服務(wù)”了,。我在講述一些抽象概念(如可尋址性)時(shí),會給出一些真實(shí)的URIs,,這樣你就可以通過在瀏覽器里輸入這些URIs來親身體會有關(guān)概念了,。 面向資源的架構(gòu)? Resource-Oriented What Now? 為什么要發(fā)明一個新詞“面向資源的架構(gòu)(Resource-OrientedArchitecture,,ROA)”呢,? 但是,,REST并不是一種架構(gòu),,而是一組設(shè)計(jì)原則。你可以講“在遵守這些原則方面,,一個架構(gòu)做得比另一個架構(gòu)好”,,但是你不能講“REST架構(gòu)”,,因?yàn)椴淮嬖谝粋€叫“REST架構(gòu)”的東西。 直到目前為止,,人們已經(jīng)習(xí)慣于在設(shè)計(jì)服務(wù)時(shí),,根據(jù)他們自己對REST的理解發(fā)明一次性架構(gòu)(one-offarchitectures)。這樣做最顯著的結(jié)果,,是產(chǎn)生了各式各樣的REST-RPC混合Web服務(wù),,而其創(chuàng)建者們還聲稱它們?yōu)镽EST式的。為此,,我提出了一組構(gòu)建真正REST式Web服務(wù)的具體規(guī)則,,以期能夠結(jié)束這一狀況,。在接下來的兩章里,,我會給出一些簡單的步驟,你只要根據(jù)這些步驟就能把需求轉(zhuǎn)換成一個個資源(resources),。即便不喜歡我的規(guī)則,,你至少可以知道作哪些改變是不會導(dǎo)致違反REST風(fēng)格的。 作為一組設(shè)計(jì)原則,,REST是非常通用的,。具體地說,它并不限定于Web,。REST不依賴于HTTP機(jī)制或URI結(jié)構(gòu),。但因?yàn)槲矣懻摰氖荳eb服務(wù),所以特地用Web相關(guān)技術(shù)來講解面向資源的架構(gòu)(ROA),。我想在特定的編程語言中探討如何用HTTP和URI來實(shí)現(xiàn)REST,。假如將來出現(xiàn)非基于Web的REST式架構(gòu),它的最佳實(shí)踐(best practices)將跟ROA的差不多,,只是具體細(xì)節(jié)會有點(diǎn)差別,。到時(shí)我們會有辦法解決的。 REST的傳統(tǒng)定義留下了一些空白,,這給實(shí)踐者們創(chuàng)造了傳播坊間傳言(folklore)的環(huán)境,。我特意在Roy Fielding的博士論文及W3C相關(guān)標(biāo)準(zhǔn)的基礎(chǔ)上更進(jìn)一步——希望對部分問題做一個了結(jié),把那些坊間傳言提煉為一組明確定義的最佳實(shí)踐,。即便REST是一種架構(gòu),,用REST來稱呼我的架構(gòu)也是不公平的。我會把自己的實(shí)踐經(jīng)驗(yàn)和建議,,與那些關(guān)于Web的總體想法結(jié)合起來,。 我提出ROA這個新詞的根本原因是:“REST”這個詞被太多地用在派別之爭里。假如某人提到這個詞,,那通常暗示著,,他本人所贊同的架構(gòu)才是真正的REST式架構(gòu),,而贊同別的REST式架構(gòu)的人則會對此持有異議。盡管REST社區(qū)在一些基本問題(比如URI和HTTP的價(jià)值)上已達(dá)成一致,,但REST社區(qū)還是存在著不同派別,。 最理想的狀況是沒有派別之爭??墒?,太多的經(jīng)驗(yàn)告訴我,僅憑意愿并不能結(jié)束它,。所以,,要給我的關(guān)于“應(yīng)當(dāng)如何設(shè)計(jì)REST式應(yīng)用”的思想取一個不同的名字。這樣,,萬一這些想法被不可避免地用到派別之爭中時(shí),,那些不同意的人就可以針對我的面向資源的架構(gòu)(ROA),而不是跟REST式架構(gòu)或一般的REST混為一談,。先要把概念理清了,,才可能做到理解。 “面向資源的(resource-oriented)”和“面向資源的架構(gòu)(resource-orientedarchitecture)”這樣的措辭已經(jīng)被用于描述一般的REST式架構(gòu)了(注1),。我承認(rèn)“面向資源的架構(gòu)”并不完全是我原創(chuàng)的詞,,但我的用法跟先前的用法剛好吻合,而且我覺得采用這個詞比聲稱代表整個REST要好,。
|
|