REST和SOAP:誰(shuí)更好 或者都好?
如今,Web開(kāi)發(fā)者的可選技術(shù)相當(dāng)之多;從簡(jiǎn)化的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù),到易用的中間件服務(wù)包裝技術(shù),以及各種有趣的客戶端軟件等等,一應(yīng)俱全。所有這些產(chǎn)品和工具,都是為了幫助Web開(kāi)發(fā)者用最快的速度開(kāi)發(fā)出最好的Web應(yīng)用。
然而,擁有大量可選軟件方案以及為Web應(yīng)用的特定部分選用特定方案,都是具有挑戰(zhàn)的事;而且,現(xiàn)在Web開(kāi)發(fā)者必須持續(xù)跟蹤各種不斷變化著的標(biāo)準(zhǔn)與方法。
舉個(gè)例子,Web服務(wù)技術(shù)就有SOAP(SimpleObjectAccessProtocol,簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議)和REST(RepresentationalStateTransfer,表示性狀態(tài)轉(zhuǎn)移)這兩種方案。它們都是有效的方案,但在具體場(chǎng)合下采用哪種方案好,這要取決于Web開(kāi)發(fā)者。
目前,大部分Web開(kāi)發(fā)者似乎都了解REST——一種采用標(biāo)準(zhǔn)URI進(jìn)行調(diào)用的方案。REST很容易理解,而且只要是支持HTTP/HTTPS的客戶端/服務(wù)器就支持它。你可以用HTTPGET方法來(lái)執(zhí)行命令。所以,開(kāi)發(fā)者們感受到的REST的優(yōu)勢(shì)是:開(kāi)發(fā)簡(jiǎn)單、只需依托現(xiàn)有Web基礎(chǔ)設(shè)施、以及學(xué)習(xí)成本低。
然而,SOAP作為一種古老的Web服務(wù)技術(shù),短期內(nèi)還不會(huì)退出歷史舞臺(tái)。而且,隨著SOAP1.2的出現(xiàn),SOAP印象中的一些缺點(diǎn)已得到改進(jìn),采納率和易用程度也都得到提高。另需注意的是,從W3CSOAP1.2版開(kāi)始,SOAP這一縮寫(xiě)不再代表SimpleObjectAccessProtocol(簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議),而是僅僅作為協(xié)議名稱(chēng)而已。
相對(duì)REST而言,SOAP1.2多出一些開(kāi)銷(xiāo),不過(guò)這些開(kāi)銷(xiāo)也帶來(lái)了一些好處。首先,SOAP在三個(gè)方面離不開(kāi)XML(ExtensibleMarkupLanguage,可擴(kuò)展標(biāo)記語(yǔ)言):SOAP信封(envelope)是基于XML的,它定義了消息里有什么以及如何處理它;一套用于數(shù)據(jù)類(lèi)型的編碼規(guī)則;過(guò)程調(diào)用和響應(yīng)的規(guī)劃。SOAP信封由傳輸協(xié)議(HTTP/HTTPS)發(fā)出,RPC(RemoteProcedureCall,遠(yuǎn)程過(guò)程調(diào)用)得到執(zhí)行,然后一個(gè)XML文檔隨SOAP信封返回。
需要注意的是,基于“通用”傳輸協(xié)議是SOAP的一個(gè)優(yōu)點(diǎn)。REST目前基于HTTP/HTTPS;而SOAP可支持任何傳輸協(xié)議,從HTTP/HTTPS到SMTP(SimpleMailTransferProtocol,簡(jiǎn)單郵件傳送協(xié)議),甚至JMS(JavaMessagingService,Java消息傳遞服務(wù))。不過(guò),由于XML較為冗長(zhǎng)且解析費(fèi)時(shí),因此采用XML也成為一個(gè)弊端。
不過(guò),對(duì)Web開(kāi)發(fā)者來(lái)說(shuō)的好消息是,目前上述兩種方案都是行之有效的方案。REST和SOAP都能解決許多Web方面的問(wèn)題與挑戰(zhàn),而且在許多情況下,它們各自都能滿足開(kāi)發(fā)者的要求,也就是說(shuō)可互換使用。
但很多人不知道,這兩種技術(shù)可以混合搭配使用。REST很好理解,且極易上手;不過(guò)由于它缺乏標(biāo)準(zhǔn),因此只被看作是一種架構(gòu)方法。與之相比,SOAP是一個(gè)工業(yè)標(biāo)準(zhǔn),它具備良好定義的協(xié)議,以及一套良好確立的規(guī)則,在大型和小型系統(tǒng)中均有采用。
因此,REST的適用場(chǎng)合包括:
有限的帶寬和資源別忘了返回的結(jié)構(gòu)可以采用(由開(kāi)發(fā)者定義的)任何格式。另外,由于REST采用標(biāo)準(zhǔn)的GET、PUT、POST和DELETE動(dòng)詞,因此可被任何瀏覽器所支持。除此以外,REST還可以使用為目前大多數(shù)瀏覽器支持的XMLHttpRequest對(duì)象,這為AJAX增色不少。
完全無(wú)狀態(tài)的操作對(duì)于那些需多步執(zhí)行的操作,REST并非最佳選擇,采用SOAP更合適。但是,如果你需要無(wú)狀態(tài)的CRUD(Create/Read/Update/Delete,創(chuàng)建/讀取/更新/刪除)操作,那么應(yīng)采用REST。
緩存考慮若要利用無(wú)狀態(tài)操作的特性,使得信息可被緩存,那么REST是很好的選擇。
以上已經(jīng)覆蓋很多方案了,那么,為什么還要考慮SOAP呢?正如前述,SOAP比較成熟而且是經(jīng)過(guò)良好定義的,具有完整的規(guī)范。而REST只不過(guò)是一種方法,對(duì)開(kāi)發(fā)未作任何規(guī)約;因此,假如你遇到以下場(chǎng)合,那么SOAP是最佳選擇:
異步處理與調(diào)用如果你的應(yīng)用需要確??煽啃耘c安全性,那么請(qǐng)采用SOAP。SOAP1.2為確保這種操作補(bǔ)充定義了WSRM(WS-ReliableMessaging)等標(biāo)準(zhǔn)。
形式化契約若提供者/消費(fèi)者雙方必須就交換格式取得一致,那么采用SOAP更合適。SOAP1.2為這種交互提供了嚴(yán)格的規(guī)范。
有狀態(tài)的操作如果應(yīng)用需要上下文信息與對(duì)話狀態(tài)管理,那么應(yīng)采用SOAP。SOAP1.2為此補(bǔ)充定義了WS-Security、WS-Transactions和WS-Coordination等標(biāo)準(zhǔn)。相比之下,REST方法要求開(kāi)發(fā)者自己來(lái)實(shí)現(xiàn)這些框架性工作。
正如你所看到的,REST和SOAP各自有其用武之地。它們?cè)诎踩院蛡鬏攲拥确矫嬗兄约旱臐撛趩?wèn)題,不過(guò)它們都能完成任務(wù),而且在許多情況下,它們都豐富了Web的技術(shù)手段。因此,就這一論題,其實(shí)最好的原則就是靈活性原則;因?yàn)橹辽僭诂F(xiàn)今的Web開(kāi)發(fā)中,無(wú)論面對(duì)何種問(wèn)題,Web開(kāi)發(fā)者們總有辦法運(yùn)用好這兩種技術(shù)中的一種。
【編輯推薦】