小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

面向資源與面向活動(dòng)的 Web 服務(wù)

 hx99 2007-06-30

REST 樣式與 SOAP 樣式 Web 服務(wù)之間關(guān)系的概覽






級(jí)別: 初級(jí)

James M. Snell, 軟件工程師, IBM

2004 年 11 月 01 日

Bloglines API 最近的發(fā)布引發(fā)了又一輪關(guān)于是使用 REpresentational State Transfer(REST)還是使用簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(Simple Object Access Protocol,SOAP)Web 服務(wù)的討論。然而與一些人所認(rèn)為的相反,這些不同的面向服務(wù)體系結(jié)構(gòu)(Service-Oriented Architecture,SOA)設(shè)計(jì)模式不是互斥的。也不是說(shuō)一個(gè)就比另外一個(gè)優(yōu)越。對(duì)于不同的應(yīng)用場(chǎng)景,它們每一個(gè)都有自己相對(duì)的優(yōu)勢(shì)和劣勢(shì),并且它們都是解決實(shí)際客戶的實(shí)際問(wèn)題的有效方法。訣竅就在于能夠決定采用哪一種方法。答案可能比您想象的更簡(jiǎn)單。

每當(dāng)一些 Web 應(yīng)用服務(wù)提供方提出允許開(kāi)發(fā)者集成他們的服務(wù)的 Web 服務(wù) API 時(shí),大家都非常關(guān)心由 API 實(shí)現(xiàn)的互操作設(shè)計(jì)模式。如果 API 使用的是 REST 樣式的互操作,REST 方法的擁護(hù)者就會(huì)將該 API 作為說(shuō)明為什么 REST 樣式服務(wù)比 SOAP 樣式服務(wù)更優(yōu)越的重要例子而加以稱贊;同樣地,如果 API 使用 SOAP 樣式 Web 服務(wù)模式,情況也類似。似乎很少有人關(guān)心這樣的一個(gè)事實(shí),模式的選擇主要取決于正在被執(zhí)行的應(yīng)用程序的類型,并且像所有優(yōu)秀的體系結(jié)構(gòu)決策一樣,開(kāi)發(fā)者應(yīng)該將他們的選擇基于正在被開(kāi)發(fā)的應(yīng)用程序的特定技術(shù)需求和特性,而不是基于針對(duì)單一體系結(jié)構(gòu)方法的一些特殊偏好。

資源還是活動(dòng)?

從基本原理層次上說(shuō),REST 樣式和 SOAP 樣式 Web 服務(wù)的區(qū)別取決于應(yīng)用程序是面向 資源的還是面向 活動(dòng)的。

面向資源服務(wù)集中于明確的數(shù)據(jù)對(duì)象,一些基本、標(biāo)準(zhǔn)的操作可以依據(jù)這些數(shù)據(jù)對(duì)象而執(zhí)行。如權(quán)威的 Gang of Four(GoF) 設(shè)計(jì)模式這本書(shū)所述,對(duì)于熟悉面向?qū)ο笤O(shè)計(jì)模式概念的開(kāi)發(fā)者來(lái)說(shuō),面向資源服務(wù)與基本 Memento 模式類似。實(shí)際上,服務(wù)提供方維護(hù)一組資源,并且公開(kāi)一組基本操作來(lái)執(zhí)行以下任務(wù):

  • 檢索資源
  • 修改資源
  • 創(chuàng)建新資源
  • 刪除資源

根據(jù)定義,REST 樣式 Web 服務(wù)是面向資源的服務(wù)。您可以通過(guò)統(tǒng)一資源標(biāo)識(shí)符(Universal Resource Identifier,URI)來(lái)識(shí)別和定位資源,并且針對(duì)這些資源而執(zhí)行的操作是通過(guò) HTTP 規(guī)范定義的。其核心操作包括:

  • GET - 該操作返回已標(biāo)識(shí)資源的狀態(tài)表示。您可以通過(guò)大量的上下文要素來(lái)確定狀態(tài),例如誰(shuí)正在提交請(qǐng)求、操作的參數(shù)(傳入的參數(shù)如 HTTP 頭或者查詢字符串參數(shù))和服務(wù)提供方維護(hù)的當(dāng)前會(huì)話狀態(tài)。
  • POST - 該操作執(zhí)行對(duì)已標(biāo)識(shí)資源的一些特定于應(yīng)用程序形式的更新。該操作行為完全依賴于實(shí)現(xiàn)它的服務(wù)。由該操作返回的數(shù)據(jù)也完全依賴于應(yīng)用程序。舉例來(lái)說(shuō),像 GET 操作一樣,它可以返回一個(gè)狀態(tài)表示,它還可以選擇根本不返回任何數(shù)據(jù)。
  • PUT - 該操作在已標(biāo)識(shí)位置(URI)創(chuàng)建新資源。操作輸入必須包括一個(gè)資源的狀態(tài)表示。它完全依賴服務(wù)來(lái)創(chuàng)建基于這個(gè)狀態(tài)表示的資源。
  • DELETE - DELETE 操作銷毀已標(biāo)識(shí)位置(URI)的資源。

在許多方面,REST 樣式 Web 服務(wù)與 SQL、元組空間(tuple spaces)、簡(jiǎn)單消息列隊(duì)等技術(shù)相似。它們都使用普通的簡(jiǎn)單操作針對(duì)明確的資源起作用。

  • SQL - SELECT、INSERT、DELETE、UPDATE 等
  • 元組空間 - GET、PUT
  • 消息列隊(duì) - SEND、RECEIVE

在每一個(gè)案例中,服務(wù)接口的設(shè)計(jì)允許您移動(dòng)關(guān)于資源的信息,讓其依賴于請(qǐng)求方來(lái)指出希望通過(guò)這些信息來(lái)做什么。

與此相對(duì)的是 面向活動(dòng)的資源。該類型的應(yīng)用程序集中于您可能執(zhí)行的操作,而不是集中于操作所依靠的資源?;顒?dòng)服務(wù)的一個(gè)簡(jiǎn)單的例子就是銀行事務(wù),在那里用戶可以把錢從一個(gè)賬戶轉(zhuǎn)移到另一個(gè)賬戶上。用戶不想直接操作資源(錢、銀行賬戶等等),他們只想告訴銀行他們想要達(dá)到的目的,并且讓銀行根據(jù)他們的利益對(duì)資源進(jìn)行處理。用 GoF 術(shù)語(yǔ)來(lái)描述應(yīng)用程序:

  • 命令
  • 中介方
  • 策略
  • 代理設(shè)計(jì)模式

面向資源服務(wù)不管資源的類型怎樣,執(zhí)行的操作可以保持相對(duì)不變,與面向資源服務(wù)不同,面向活動(dòng)服務(wù)的操作完全依賴于正在執(zhí)行的活動(dòng)類型。例如,銀行服務(wù)可以公開(kāi)一個(gè)名為 transferFunds 的操作,該操作不同的輸入將完全決定服務(wù)的資金轉(zhuǎn)移功能。

在面向資源的服務(wù)中,一組普通操作擔(dān)當(dāng)支持性的工作角色,為客戶端提供訪問(wèn)和操作資源。然而,資源是關(guān)注的中心,如下面 圖 1 所示。



圖 1. 面向資源服務(wù)與面向活動(dòng)服務(wù)的比較
圖 1. 面向資源服務(wù)與面向活動(dòng)服務(wù)的比較

在面向活動(dòng)服務(wù)中,對(duì)客戶端請(qǐng)求執(zhí)行的每個(gè)活動(dòng)的單一操作來(lái)說(shuō),操作是關(guān)注的中心。

SOAP 樣式 Web 服務(wù)通常是面向活動(dòng)的。 WSDL 文檔定義并描述特定于服務(wù)的操作。操作由特定于服務(wù)的消息交換組成。每一個(gè)操作都是一個(gè)可以執(zhí)行的活動(dòng)。那些正在被執(zhí)行的操作所針對(duì)的內(nèi)容通常是不相關(guān)的。正如 Web 服務(wù)資源框架系列規(guī)范所描述的,資源可以隱含在活動(dòng)之中,但是這種隱含與活動(dòng)的定義不相關(guān),并且只是為了改進(jìn)執(zhí)行活動(dòng)所依賴的上下文。與針對(duì)資源而執(zhí)行活動(dòng)的面向資源服務(wù)相比,它和用來(lái)訪問(wèn)資源的服務(wù)接口互不相關(guān)。





回頁(yè)首


結(jié)合上下文:Bloglines 資源

Bloglines 是一個(gè)基于 Web 的應(yīng)用服務(wù),它允許個(gè)人對(duì) weblog 和新聞的各種訂閱保持跟蹤,這些訂閱內(nèi)容以 Really Simple Syndication(RSS)和 Atom 提供的形式交付。

Bloglines 服務(wù)根本上是面向資源的。用戶創(chuàng)建、更新、和刪除訂閱,并且定期訪問(wèn)服務(wù)來(lái)了解自上次訪問(wèn)站點(diǎn)后發(fā)生了哪些更新。Bloglines API 利用 REST 樣式 Web 服務(wù)接口適當(dāng)?shù)胤从沉嗣嫦蛸Y源的特性。

特別地,對(duì)于 Bloglines 來(lái)說(shuō)重要的是訂閱的用戶集合,如眾所周知的 blogroll。單個(gè) blogroll 會(huì)由許多不同的訂閱組成。一個(gè) 訂閱指向一個(gè) RSS 或者一個(gè) Atom 提供。

Blogrolls 和訂閱都是資源。Bloglines API 使用基本 HTTP 操作來(lái)檢索關(guān)于用戶的 blogroll 和訂閱資源的當(dāng)前狀態(tài)信息。

例如,要訪問(wèn)用戶 blogroll 的當(dāng)前快照,用戶向 URI //rpc./listsubs 發(fā)送一個(gè) HTTP GET 請(qǐng)求。在嚴(yán)格的 REST 條件下,該 API 確定了每一個(gè) Bloglines 用戶的訂閱。當(dāng)調(diào)用這個(gè)操作時(shí),HTTP 身份驗(yàn)證請(qǐng)求收集關(guān)于檢索哪個(gè)用戶訂閱的附加上下文。由 XML 文檔組成的操作返回的信息為已驗(yàn)證用戶列出所有的個(gè)人訂閱。

為訪問(wèn)特定訂閱的當(dāng)前快照,用戶對(duì) URI http://rpc./getitems?s={subid} 發(fā)送一個(gè) HTTP GET 請(qǐng)求,如上述 listsubs 操作的結(jié)果中所展示的, {subid} 是 Bloglines 分配的唯一訂閱標(biāo)志符。定義附加參數(shù),包括(非常有趣)一個(gè)實(shí)際上違反了基本 REST 規(guī)則的參數(shù),也就是說(shuō),它們不應(yīng)該引起資源狀態(tài)中的任何變化。當(dāng)被提供時(shí),參數(shù) (n=1) 指示 Bloglines 服務(wù)將以前未讀的訂閱條目標(biāo)記為正在讀取,這實(shí)際上改變了資源狀態(tài)。

要返回當(dāng)前用戶 blogroll 中未讀的訂閱條目的數(shù)量,用戶可以向 URI http://rpc./update?user={email}&ver=1 發(fā)送一個(gè) HTTP GET 請(qǐng)求,這里 {email} 是用戶的 email 地址,這些用戶的賬戶應(yīng)該被檢查,以獲得未讀的訂閱條目。

Bloglines API 參與的唯一一件事是允許有計(jì)劃的訪問(wèn) blogrolls 和訂閱資源。API 不關(guān)心客戶端訪問(wèn) blogrolls 或訂閱時(shí)會(huì)如何處理它們。

提供一個(gè)對(duì)照,與 IBM 最近實(shí)現(xiàn)的概念驗(yàn)證工程做比較來(lái)闡明 Web 服務(wù)在自動(dòng)化醫(yī)院患者紀(jì)錄的訪問(wèn)、處方的編寫(xiě)、手術(shù)的安排等方面的用途。不做詳細(xì)的說(shuō)明(與客戶端的非公開(kāi)協(xié)議涉及的內(nèi)容),為系統(tǒng)建立的服務(wù)接口的集合完全集中于用戶在系統(tǒng)中執(zhí)行的活動(dòng)。例如,為患者安排手續(xù)或檢查,并請(qǐng)求檢查結(jié)果的有效性等事件的異步通知?;颊叩臋n案(資源)是系統(tǒng)的一個(gè)很重要的方面,它通常在全部的應(yīng)用程序中起到支持的作用,但不是系統(tǒng)的主要焦點(diǎn)。更確切地說(shuō),醫(yī)院原型是一個(gè)面向活動(dòng)的服務(wù),這由它的 SOAP 樣式 Web 服務(wù)體系結(jié)構(gòu)確切的反映出來(lái)。

要點(diǎn)很簡(jiǎn)單:REST 和 SOAP 的選擇歸結(jié)為對(duì)您的特定應(yīng)用程序的最重要部分的理解。如果您的應(yīng)用程序主要集中在訪問(wèn)信息資源的能力(如 Bloglines 服務(wù)),那么您用的主要是面向資源服務(wù),并且您的應(yīng)用程序應(yīng)該是 REST 樣式的設(shè)計(jì)模式。這里應(yīng)該優(yōu)先考慮 Amazon、del.、Flickr 還有其他的一些廠商(請(qǐng)參閱 參考資料)提供的服務(wù) API。然而,如果您的應(yīng)用程序主要集中于被執(zhí)行的活動(dòng)(這些活動(dòng)與所依賴的資源不相關(guān)),那么您的服務(wù)是面向活動(dòng)的,并且應(yīng)該利用 SOAP 樣式的設(shè)計(jì)模式。





回頁(yè)首


功能與形式

基于 REST 的模式的支持者常常指出它的體系結(jié)構(gòu)化的簡(jiǎn)單性,并將其和 SOAP 型的 Web 服務(wù)規(guī)范的復(fù)雜性相比較,以此來(lái)說(shuō)明為什么 REST 是更優(yōu)越的方法。正如我已經(jīng)闡明的,這一論斷是有缺陷的,這兩種方法要解決不同類型的問(wèn)題?;?Web 的應(yīng)用程序服務(wù),例如 Bloglines、Amazon、flikr、del. 等等,要面對(duì)不同類型的問(wèn)題,這不是說(shuō)說(shuō)那么簡(jiǎn)單。醫(yī)院需要將定制規(guī)程、編寫(xiě)處方的內(nèi)部流程自動(dòng)化,因此要求一個(gè)不同的體系結(jié)構(gòu)化方法。這就是設(shè)計(jì)模式存在的原因 -- 不同的方法解決不同的問(wèn)題。

在特定業(yè)務(wù)需求上下文之外進(jìn)行比較,REST 體系結(jié)構(gòu)表面上好像遠(yuǎn)不及該行業(yè)提出的各種 WS-* 規(guī)范所定義的 SOAP Web 服務(wù)體系結(jié)構(gòu)復(fù)雜。而且,在某些關(guān)鍵地方它的功能也遠(yuǎn)沒(méi)有那么強(qiáng)大。可靠消息是一個(gè)主要的例子。HTTP 不是一個(gè)可靠協(xié)議。這里沒(méi)有使用一次且僅一次(once-and-only-once)或者重試直至成功(retry-until-success)的語(yǔ)義以允許可靠傳輸 HTTP 請(qǐng)求的機(jī)制。REST/HTTP 中也沒(méi)有在基本 HTTP 代理機(jī)制之外進(jìn)行消息路由的機(jī)制。在 REST 服務(wù)中的安全性上下文也通常局限于 HTTP 協(xié)議提供的安全機(jī)制,除非應(yīng)用程序選擇采用一些外部定義的安全機(jī)制(例如,一個(gè) REST 服務(wù)實(shí)際上能返回?cái)?shù)字簽名或者加密 SOAP 消息來(lái)響應(yīng) HTTP GET 請(qǐng)求)。

對(duì)于如 Bloglines 之類的服務(wù),這些功能限制不是關(guān)鍵,因?yàn)橛?HTTP 提供的基本選項(xiàng)足以滿足應(yīng)用程序的需要。API 不需要:

  • 可靠消息傳遞
  • 數(shù)字簽名
  • 消息路由
  • 資源生命周期管理
  • 異步事件通知
  • 由 SOAP WS-* 規(guī)范引進(jìn)的其他性能

這并不意味著其他應(yīng)用程序不要求由基于活動(dòng)的方法所提供的增強(qiáng)功能。

不要理解錯(cuò)我的意思,所有這些在 REST 樣式服務(wù)中做的事情至少?gòu)睦碚撋现v是完全可行的。關(guān)鍵的問(wèn)題是沒(méi)有人定義過(guò)這樣做的一致的標(biāo)準(zhǔn)方法。既然如此,舉例來(lái)說(shuō),任何人使用任何方法在 REST 樣式接口中做這樣的工作(如異步事件通知或可靠消息傳輸),都將會(huì)是特定于實(shí)現(xiàn)的一次性服務(wù),通常不會(huì)被其它 REST 樣式的服務(wù)支持。然而需要指出的更重要的問(wèn)題是,通常與適合于面向資源的服務(wù)相比,這些擴(kuò)展的功能更適合于面向活動(dòng)的服務(wù),因此在面向活動(dòng)的 SOAP 樣式服務(wù)領(lǐng)域里,我們見(jiàn)到更多的規(guī)范和更大的復(fù)雜性也就不奇怪了。

注意:如果處理適當(dāng),復(fù)雜性并不是一件壞事。是的,有很多 WS-* 規(guī)范,涉及了很大范圍的技術(shù)主題。從總體上看,它們代表了更高的復(fù)雜性。然而,它們定義的方法包含這樣的概念,即僅僅提取對(duì)應(yīng)用程序必要的一部分規(guī)范。沒(méi)有人會(huì)期待每一個(gè) Web 服務(wù)都能執(zhí)行全部的 WS-* 規(guī)范。





回頁(yè)首


概要:關(guān)于服務(wù)

最后,行業(yè)繼續(xù)朝著面向服務(wù)體系結(jié)構(gòu)方向前進(jìn),這是非常重要的。做出 REST 樣式和 SOAP 樣式的選擇,應(yīng)該與為給定應(yīng)用程序組件實(shí)現(xiàn) 命令、中介方、觀測(cè)器、策略或是訪問(wèn)者設(shè)計(jì)模式之間進(jìn)行選擇一樣謹(jǐn)慎。簡(jiǎn)單地說(shuō),那只不過(guò)是一個(gè)基于業(yè)務(wù)和應(yīng)用需要的設(shè)計(jì)策略,但卻會(huì)嚴(yán)重影響您的應(yīng)用程序的使用和將來(lái)的發(fā)展。然而,比 Web 服務(wù)設(shè)計(jì)模式的選擇更為重要的是提供 Web 服務(wù)的選擇。無(wú)論您選擇實(shí)現(xiàn)哪種樣式的服務(wù),這都是非常關(guān)鍵的。



參考資料



關(guān)于作者

Author photo

James Snell 是 IBM Emerging Technologies Toolkit 的成員,在過(guò)去的幾年里,他一直致力于新興的 Web 服務(wù)技術(shù)和標(biāo)準(zhǔn)。他維護(hù)著 http://www.ibm.com/developerworks/blogs/snell 上的新興技術(shù)的 weblog。您可以通過(guò) jasnell@us.ibm.com 與他聯(lián)系。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多