什么是REST,? REST (REpresentation State Transfer) 描述了一個(gè)架構(gòu)樣式的網(wǎng)絡(luò)系統(tǒng),,比如 web 應(yīng)用程序。它首次出現(xiàn)在 2000 年 Roy Fielding 的博士論文中,,他是 HTTP 規(guī)范的主要編寫者之一,。REST 指的是一組架構(gòu)約束條件和原則。滿足這些約束條件和原則的應(yīng)用程序或設(shè)計(jì)就是 RESTful,。 Web 應(yīng)用程序最重要的 REST 原則是,,客戶端和服務(wù)器之間的交互在請(qǐng)求之間是無(wú)狀態(tài)的。從客戶端到服務(wù)器的每個(gè)請(qǐng)求都必須包含理解請(qǐng)求所必需的信息,。如果服務(wù)器在請(qǐng)求之間的任何時(shí)間點(diǎn) 重啟,,客戶端不會(huì)得到通知。此外,無(wú)狀態(tài)請(qǐng)求可以由任何可用服務(wù)器回答,,這十分適合云計(jì)算之類的環(huán)境,。客戶端可以緩存數(shù)據(jù)以改進(jìn)性能,。 在服務(wù)器端,,應(yīng)用程序狀態(tài)和功能可以分為各種資源。資源是一個(gè)有趣的概念實(shí)體,,它向客戶端公開,。資源的例子有:應(yīng)用程序?qū)ο蟆?shù)據(jù)庫(kù)記錄,、算法等 等。每個(gè)資源都使用 URI (Universal Resource Identifier) 得到一個(gè)惟一的地址,。所有資源都共享統(tǒng)一的界面,,以便在客戶端和服務(wù)器之間傳輸狀態(tài)。使用的是標(biāo)準(zhǔn)的 HTTP 方法,,比如 GET,、PUT、POST 和 DELETE,。Hypermedia 是應(yīng)用程序狀態(tài)的引擎,,資源表示通過超鏈接互聯(lián)。 另一個(gè)重要的 REST 原則是分層系統(tǒng),,這表示組件無(wú)法了解它與之交互的中間層以外的組件,。通過將系統(tǒng)知識(shí)限制在單個(gè)層,可以限制整個(gè)系統(tǒng)的復(fù)雜性,,促進(jìn)了底層的獨(dú)立性,。 當(dāng) REST 架構(gòu)的約束條件作為一個(gè)整體應(yīng)用時(shí),將生成一個(gè)可以擴(kuò)展到大量客戶端的應(yīng)用程序,。它還降低了客戶端和服務(wù)器之間的交互延遲,。統(tǒng)一界面簡(jiǎn)化了整個(gè)系統(tǒng)架構(gòu),改進(jìn)了子系統(tǒng)之間交互的可見性,。REST 簡(jiǎn)化了客戶端和服務(wù)器的實(shí)現(xiàn),。 RESTful的實(shí)現(xiàn):RESTful Web 服務(wù)與 RPC 樣式的 Web 服務(wù) 了解了什么是什么是REST,我們?cè)倏纯碦ESTful的實(shí)現(xiàn),。最近,,使用 RPC 樣式架構(gòu)構(gòu)建的基于 SOAP 的 Web 服務(wù)成為實(shí)現(xiàn) SOA 最常用的方法。RPC 樣式的 Web 服務(wù)客戶端將一個(gè)裝滿數(shù)據(jù)的信封(包括方法和參數(shù)信息)通過 HTTP 發(fā)送到服務(wù)器,。服務(wù)器打開信封并使用傳入?yún)?shù)執(zhí)行指定的方法,。方法的結(jié)果打包到一個(gè)信封并作為響應(yīng)發(fā)回客戶端。客戶端收到響應(yīng)并打開信封,。每個(gè)對(duì)象都有自 己獨(dú)特的方法以及僅公開一個(gè) URI 的 RPC 樣式 Web 服務(wù),,URI 表示單個(gè)端點(diǎn)。它忽略 HTTP 的大部分特性且僅支持 POST 方法,。 由于輕量級(jí)以及通過 HTTP 直接傳輸數(shù)據(jù)的特性,,Web 服務(wù)的 RESTful 方法已經(jīng)成為最常見的替代方法??梢允褂酶鞣N語(yǔ)言(比如 Java 程序,、Perl、Ruby,、Python,、PHP 和 Javascript[包括 Ajax])實(shí)現(xiàn)客戶端。RESTful Web 服務(wù)通??梢酝ㄟ^自動(dòng)客戶端或代表用戶的應(yīng)用程序訪問,。但是,這種服務(wù)的簡(jiǎn)便性讓用戶能夠與之直接交互,,使用它們的 Web 瀏覽器構(gòu)建一個(gè) GET URL 并讀取返回的內(nèi)容,。 在 REST 樣式的 Web 服務(wù)中,每個(gè)資源都有一個(gè)地址,。資源本身都是方法調(diào)用的目標(biāo),,方法列表對(duì)所有資源都是一樣的。這些方法都是標(biāo)準(zhǔn)方法,,包括 HTTP GET,、POST、PUT,、DELETE,,還可能包括 HEADER 和 OPTIONS。 在 RPC 樣式的架構(gòu)中,,關(guān)注點(diǎn)在于方法,,而在 REST 樣式的架構(gòu)中,關(guān)注點(diǎn)在于資源 —— 將使用標(biāo)準(zhǔn)方法檢索并操作信息片段(使用表示的形式),。資源表示形式在表示形式中使用超鏈接互聯(lián),。 Leonard Richardson 和 Sam Ruby 在他們的著作 RESTful Web Services 中引入了術(shù)語(yǔ) REST-RPC 混合架構(gòu)。REST-RPC 混合 Web 服務(wù)不使用信封包裝方法,、參數(shù)和數(shù)據(jù),,而是直接通過 HTTP 傳輸數(shù)據(jù),這與 REST 樣式的 Web 服務(wù)是類似的,。但是它不使用標(biāo)準(zhǔn)的 HTTP 方法操作資源,。它在 HTTP 請(qǐng)求的 URI 部分存儲(chǔ)方法信息,。好幾個(gè)知名的 Web 服務(wù),比如 Yahoo 的 Flickr API 和 del.icio.us API 都使用這種混合架構(gòu),。 RESTful的實(shí)現(xiàn):RESTful Web 服務(wù)的 Java 框架 有兩個(gè) Java 框架可以幫助構(gòu)建 RESTful Web 服務(wù),。erome Louvel 和 Dave Pawson 開發(fā)的 Restlet(見 參考資料)是輕量級(jí)的。它實(shí)現(xiàn)針對(duì)各種 RESTful 系統(tǒng)的資源,、表示,、連接器和媒體類型之類的概念,包括 Web 服務(wù),。在 Restlet 框架中,,客戶端和服務(wù)器都是組件。組件通過連接器互相通信,。該框架最重要的類是抽象類 Uniform 及其具體的子類 Restlet,,該類的子類是專用類,比如 Application,、Filter,、Finder、Router 和 Route,。這些子類能夠一起處理驗(yàn)證、過濾,、安全,、數(shù)據(jù)轉(zhuǎn)換以及將傳入請(qǐng)求路由到相應(yīng)資源等操作。Resource 類生成客戶端的表示形式,。 JSR-311是 Sun Microsystems 的規(guī)范,,可以為開發(fā) RESTful Web 服務(wù)定義一組 Java API。Jersey是對(duì) JSR-311 的參考實(shí)現(xiàn),。 JSR-311 提供一組注釋,,相關(guān)類和接口都可以用來(lái)將 Java 對(duì)象作為 Web 資源展示。該規(guī)范假定 HTTP 是底層網(wǎng)絡(luò)協(xié)議,。它使用注釋提供 URI 和相應(yīng)資源類之間的清晰映射,,以及 HTTP 方法與 Java 對(duì)象方法之間的映射。API 支持廣泛的 HTTP 實(shí)體內(nèi)容類型,,包括 HTML,、XML、JSON,、GIF,、JPG 等。它還將提供所需的插件功能,,以允許使用標(biāo)準(zhǔn)方法通過應(yīng)用程序添加其他類型,。 RESTful的實(shí)現(xiàn):構(gòu)建 RESTful Web 服務(wù)的多層架構(gòu) RESTful Web 服務(wù)和動(dòng)態(tài) Web 應(yīng)用程序在許多方面都是類似的,。有時(shí)它們提供相同或非常類似的數(shù)據(jù)和函數(shù),盡管客戶端的種類不同,。例如,,在線電子商務(wù)分類網(wǎng)站為用戶提供一個(gè)瀏覽器界面, 用于搜索,、查看和訂購(gòu)產(chǎn)品,。如果還提供 Web 服務(wù)供公司、零售商甚至個(gè)人能夠自動(dòng)訂購(gòu)產(chǎn)品,,它將非常有用,。與大部分動(dòng)態(tài) Web 應(yīng)用程序一樣,Web 服務(wù)可以從多層架構(gòu)的關(guān)注點(diǎn)分離中受益,。業(yè)務(wù)邏輯和數(shù)據(jù)可以由自動(dòng)客戶端和 GUI 客戶端共享,。惟一的不同點(diǎn)在于客戶端的本質(zhì)和中間層的表示層。此外,,從數(shù)據(jù)訪問中分離業(yè)務(wù)邏輯可實(shí)現(xiàn)數(shù)據(jù)庫(kù)獨(dú)立性,,并為各種類型的數(shù)據(jù)存儲(chǔ)提供插件能力。 圖 1 展示了自動(dòng)化客戶端,,包括 Java 和各種語(yǔ)言編寫的腳本,,這些語(yǔ)言包括 Python、Perl,、Ruby,、PHP 或命令行工具,比如 curl,。在瀏覽器中運(yùn)行且作為 RESTful Web 服務(wù)消費(fèi)者運(yùn)行的 Ajax,、Flash、JavaFX,、GWT,、博客和 wiki 都屬于此列,因?yàn)樗鼈兌即碛脩粢宰詣?dòng)化樣式運(yùn)行,。自動(dòng)化 Web 服務(wù)客戶端在 Web 層向 Resource Request Handler 發(fā)送 HTTP 響應(yīng),。客戶端的無(wú)狀態(tài)請(qǐng)求在頭部包含方法信息,,即 POST,、GET、PUT 和 DELETE,,這又將映射到 Resource Request Handler 中資源的相應(yīng)操作,。每個(gè)請(qǐng)求都包含所有必需的信息,包括 Resource Request Handler 用來(lái)處理請(qǐng)求的憑據(jù),。 從 Web 服務(wù)客戶端收到請(qǐng)求之后,,Resource Request Handler 從業(yè)務(wù)邏輯層請(qǐng)求服務(wù),。Resource Request Handler 確定所有概念性的實(shí)體,系統(tǒng)將這些實(shí)體作為資源公開,,并為每個(gè)資源分配一個(gè)惟一的 URI,。但是,概念性的實(shí)體在該層是不存在的,。它們存在于業(yè)務(wù)邏輯層,。可以使用 Jersey 或其他框架(比如 Restlet)實(shí)現(xiàn) Resource Request Handler,,它應(yīng)該是輕量級(jí)的,,將大量職責(zé)工作委托給業(yè)務(wù)層。 Ajax 和 RESTful Web 服務(wù)本質(zhì)上是互為補(bǔ)充的,。它們都可以利用大量 Web 技術(shù)和標(biāo)準(zhǔn),,比如 HTML、JavaScript,、瀏覽器對(duì)象,、XML/JSON 和 HTTP。當(dāng)然也不需要購(gòu)買,、安裝或配置任何主要組件來(lái)支持 Ajax 前端和 RESTful Web 服務(wù)之間的交互,。RESTful Web 服務(wù)為 Ajax 提供了非常簡(jiǎn)單的 API 來(lái)處理服務(wù)器上資源之間的交互。 圖 1 中的 Web 瀏覽器客戶端作為 GUI 的前端,,使用表示層中的 Browser Request Handler 生成的 HTML 提供顯示功能,。Browser Requester Handler 可以使用 MVC 模型(JSF、Struts 或 Spring 都是 Java 的例子),。它從瀏覽器接受請(qǐng)求,從業(yè)務(wù)邏輯層請(qǐng)求服務(wù),,生成表示并對(duì)瀏覽器做出響應(yīng),。表示供用戶在瀏覽器中顯示使用。表示不僅包含內(nèi)容,,還包含顯示的屬 性,,比如 HTML 和 CSS。 業(yè)務(wù)規(guī)則可以集中到業(yè)務(wù)邏輯層,,該層充當(dāng)表示層和數(shù)據(jù)訪問層之間的數(shù)據(jù)交換的中間層,。數(shù)據(jù)以域?qū)ο蠡蛑祵?duì)象的形式提供給表示層。從業(yè)務(wù)邏輯層中解耦 Browser Request Handler 和 Resource Request Handler 有助于促進(jìn)代碼重用,,并能實(shí)現(xiàn)靈活和可擴(kuò)展的架構(gòu),。此外,由于將來(lái)可以使用新的 REST 和 MVC 框架,,實(shí)現(xiàn)它們變得更加容易,,無(wú)需重寫業(yè)務(wù)邏輯層,。 數(shù)據(jù)訪問層提供與數(shù)據(jù)存儲(chǔ)層的交互,可以使用 DAO 設(shè)計(jì)模式或者對(duì)象-關(guān)系映射解決方案(如 Hibernate,、OJB 或 iBATIS)實(shí)現(xiàn),。作為替代方案,業(yè)務(wù)層和數(shù)據(jù)訪問層中的組件可以實(shí)現(xiàn)為 EJB 組件,,并取得 EJB 容器的支持,,該容器可以為組件生命周期提供便利,管理持久性,、事務(wù)和資源配置,。但是,這需要一個(gè)遵從 Java EE 的應(yīng)用服務(wù)器(比如 JBoss),,并且可能無(wú)法處理 Tomcat,。該層的作用在于針對(duì)不同的數(shù)據(jù)存儲(chǔ)技術(shù),從業(yè)務(wù)邏輯中分離數(shù)據(jù)訪問代碼,。數(shù)據(jù)訪問層還可以作為連接其他系統(tǒng)的集成點(diǎn),,可以成為其他 Web 服務(wù)的客戶端。 數(shù)據(jù)存儲(chǔ)層包括數(shù)據(jù)庫(kù)系統(tǒng),、LDAP 服務(wù)器,、文件系統(tǒng)和企業(yè)信息系統(tǒng)(包括遺留系統(tǒng)、事務(wù)處理系統(tǒng)和企業(yè)資源規(guī)劃系統(tǒng)),。使用該架構(gòu),,您可以開始看到 RESTful Web 服務(wù)的力量,它可以靈活地成為任何企業(yè)數(shù)據(jù)存儲(chǔ)的統(tǒng)一 API,,從而向以用戶為中心的 Web 應(yīng)用程序公開垂直數(shù)據(jù),,并自動(dòng)化批量報(bào)告腳本。 什么是REST:結(jié)束語(yǔ) REST 描述了一個(gè)架構(gòu)樣式的互聯(lián)系統(tǒng)(如 Web 應(yīng)用程序),。REST 約束條件作為一個(gè)整體應(yīng)用時(shí),,將生成一個(gè)簡(jiǎn)單、可擴(kuò)展,、有效,、安全、可靠的架構(gòu),。由于它簡(jiǎn)便,、輕量級(jí)以及通過 HTTP 直接傳輸數(shù)據(jù)的特性,RESTful Web 服務(wù)成為基于 SOAP 服務(wù)的一個(gè)最有前途的替代方案,。用于 web 服務(wù)和動(dòng)態(tài) Web 應(yīng)用程序的多層架構(gòu)可以實(shí)現(xiàn)可重用性,、簡(jiǎn)單性、可擴(kuò)展性和組件可響應(yīng)性的清晰分離,。Ajax 和 RESTful Web 服務(wù)本質(zhì)上是互為補(bǔ)充的,。開發(fā)人員可以輕松使用 Ajax 和 RESTful Web 服務(wù)一起創(chuàng)建豐富的界面,。 |
|