在電影fight club(戰爭俱樂部)中brad pitt和edward norton是一對密友??心理上對立的兩個極端??兩個小伙子嘗試互相 通信但十分艱難令人感興趣的是??沒有給出提示台詞??影片中 的大部分劇情都圍繞著肥皂的生產進行看上去像是把多個角色以獨一 無二的令人意想不到的方式綁在了一起
現在快進到一種不同類型的劇情microsoft和sun這兩個軟件密友 在internet也出演了這段劇情他們每一方都用經過良好定義的視點 試圖彌合彼此間的差異並與另一方之間建立一條通信線路進入soap 即簡單對象訪問協議
簡介SOAP簡單地講就是允許Java對象和COM對象在分布式分散的 基於Web的環境中彼此通話更一般地講SOAP允許任何類型的對象(或 代碼)??在任何平台上以任何一種語言??相互通信目前已在 多個平台上以多種語言實現了SOAP突然之間任何地方的對象 無論本地或遠程的無論大或小都可以互操作Brad Pitt和Edward Norton就像兩種截然不同的對象最終能夠通信
回顧一下這種技術我最開始將在web服務的大環境下介紹soap soap作為一種協議它與uddi(通用描述發現和集成)一起提供了業 務間注冊和消息傳遞服務我還將討論揭示發布查找綁定范例的 基於web的基礎並介紹soap包裝傳輸和發送機制
web服務的發展先把所有大肆張揚的宣傳放在一邊SOAP僅僅只是一種組件??雖然 是一種中心組件??用於把Web的藍圖描述成用於業務操作的基於標准 的語言與平台中性的架構這些業務操作通常被標上了Web 服務 的通用標簽但是Web服務自身也只是一種支持它們的良好的基礎相應 地Internet有一種快捷的n層基礎
網絡分層在Web服務的發展過程中有種網絡層是顯而易見的TCP/IP HTTP/HTML和XML現在這個層相繼構建在彼此的頂上並保持相互之間 的兼容性
第層tcp/ip協議主要關注的是以分組形式通過線纜傳輸數據 作為一種確保通過公共網絡傳輸的協議tcp/ip強調數據傳輸的可靠性 和物理連通性起初是把專用網絡粘合在一起現在則是用web中樞協議 來連接網絡更高層次的標准協議如http就是依賴於這種中樞協議的
第層http上的html它是一個顯示層自身關注的是基於浏覽器 的搜索檢索和信息共享它強調的是基於gui(圖形用戶界面)的導航 和顯示格式的處理在許多方面html更多地是用於顯示而不是轉到 別的網頁上並且在可擴展性和真正的編程能力上有所欠缺雖然如此 在浏覽器環境中共享超文本鏈接的文檔使人們用基於文本的信息與他人 通信的方式引發了革命網絡桌面環境受專用操作系統和依賴於平台 的軟件所限速度緩慢毫無疑問會讓路於基於標准的對系統開放的 internet
把這種責任引導到這個勇敢的新的基於標准的世界的是xml它 是internet的第層也可能是最引人注目的一層xml一種強類型數 據交換格式它為http/html層提供了一個新范圍在xml層中機器到 機器的通信有可能通過標准接口來進行xml層??有多種不同的描述 如aa(應用程序到應用程序)bb(業務到業務)或cc(計算機到 計算機)??允許程序在平台上交換數據格式??和顯示??獨立於編 程的方式xslt樣式表可以作為一種可選用的顯示和/或可傳輸的組件予 以添加
xml描述web服務的關鍵把這種可能變為現實的關鍵是實現機器到機器的通信這是XML力所 能及的作為一種描述數據的詞法XML是定義驅動的(通過使用DTD和 架構)並允許以編程方式處理信息這意味著大多數可考慮到的工作 都可以從BB通信中取出來可以有一致的標記可以定義接口處理也 可以是標准化的Web服務是可重用的組件程序它們把XML用作一種標 准的可擴展的通信架構以方便機器到機器類型的通信
web服務為通過http傳輸的組件數據和業務邏輯提供接口大量的數 據被放置在服務器端腳本後面的一個傳統的位置等待著被web浏覽器或 客戶程序訪問web服務承諾使許多企業領域的處於閒置狀態的公司軟 件資源獲得新生
在把駐留於web中的數據集成到企業應用程序中和協調用於組件片固 定的業務邏輯方面xml起了至關重要的作用特定的業務邏輯和服務 (包括工作流程邏輯業務邏輯組件序列邏輯交易邏輯等)可以封 裝在xml文檔中並集成到現有的業務環境中去這允許業務在內部資源 和web服務之間簡化業務交易邏輯和通過web提供鏈條式交互之間起到 槓桿作用
由於xml是人們可閱讀的和基於文本的使之可理想地用作傳輸松耦 合的web服務的架構最低限度是自動化的交易可提高生產率減少費 用和改善服務網絡標准的存在使自動化交易成為可能使所有成員的 生產率都能得到提高
soap是一種源於更早的基於xml標准的技術早期xml標准在某種意義 是指一種稱為 ebxml(電子商務xml)的顯示標准ebxml具有一種依次進行的連續 邏輯它在貿易合作者間提供了一種共享業務消息的綜合定義soap適用 的范圍更普遍也更容易實現
松耦合的系統Web服務把對象從管理它們的平台上分離開來也就是說Web服務使 獨立於平台的對象之間的交互更容易對象可以訪問Web上任何地方的數 據作為脫離專用平台的一部分Web服務依賴於松散而不是緊密耦合的 Web組件根據Brian Travis(SOAP顧問和作者)的觀點依賴於專用 對象的系統被認為是耦合緊密的因為它們依賴一種定義良好但很脆弱 的接口如果應用程序與服務對象間通信的任何部分被打斷或者如果 調用不完全正確將會發生不可預料的結果EDI就是一個用於執行電 子商務的耦合緊密的架構的例子松耦合的系統允許在開放的分布式 Web環境中進行靈活的和動態的交換
corba第二次降臨網絡上的公司??IBMBEASun僅舉幾個例子??同時在與他們 競爭的公司合作標准化的網絡傳輸協議獨立於平台的編程語言如 JavaXML和特定行業的專業用語及開放的基於組件的服務器體系結構 使每個人都能免費享用非專用的資源現在Web服務帶著其對包含廣 泛的應用程序互操作性的承諾就像一種最終的膠水使這些技術 交互作用即使不是無縫的至少也不會超過以前技術如CORBA和RMI所 帶來的累贅
在某種意義上web服務代表著corba的第二次降臨但是corba是一 種面向對象的基於iiop的二進制通信架構是由基礎骨架和特定於 供應商的orb裝載而成的而web服務則是輕型的基於http的xml驅動 的及平台和語言完全中性的如果說corba是一只重達磅的大猩猩 那麼web服務就是一只小羚羊在遼闊的internet禁區裡自由地蹦跳
發布綁定和查找Web服務的架構由發布查找綁定這個周而復始的循環組成它通過 服務提供程序使數據內容和服務能為注冊的服務請求者所用服務請 求者通過定位和綁定到服務來使用資源請求應用程序使用 WSDL(Web服務描述語言)把請求者轉到Web服務上WSDL為想要的 服務提供了一種低層次的技術信息並授權訪問關於數據編碼的XML架構 信息及通過正確的協議確保調用正確的操作
發布綁定和查找機制在個獨立(但有些等同)的協議中有它們 各自的副本這個協議是wsdlsoap和uddi(通用描述和發現接口) 它們組成了web服務網絡棧
對corba作更深層次的類推可以發現soap起到了corba中iiop(或rmi 中的jrmp)的作用它是對立的端點間的綁定機制另一方面wsdl起 到了idl(接口描述語言)的作用在這種功能上wsdl把web服務定義 成端口和操作的集合wsdl端口是模擬接口的而wsdl操作則是模擬方 法的wsdl 把web服務接口發布給那些對跨越不同平台通信感興趣的各 方
但是wsdl已經超越了一種接口定義語言它還包含允許給想發布的 web服務描述地址和協議信息的構造關於wsdl的令人感興趣的事情是它 為web服務描述了一個抽象接口同時還允許您??以難以忍受的細節 ??綁定web服務給特定的傳輸機制如http通過使接口抽象化wsdl 可用作一種可重用的web服務技術通過綁定到特定的傳輸機制wsdl生 成了抽象的類聚如果這看上去有些自相矛盾可以想一下航天飛機 它是可重復使用的但要把全機能太空艙完全綁定到專用的但不可重 復使用的助力器火箭上傳輸機制可能會改變但有效載荷會保留下來
最後uddi是用於注冊發布和查找web服務的在基於web的注冊中 通過顯示服務信息和綁定接口uddk為業務和客戶提供了一個共享目錄 以查找別人的web服務
構建web服務SOAP可通過遠程調用對象上的方法讓您構建應用程序SOAP消除 了兩種系統必須運行於同一平台上且必須是用同一種編程語言編寫而 成的要求SOAP包不是通過專用的二進制協議調用方法而是使用XML 這種基本文本的詞法來調用方法請求應用程序與接收對象之間的所有 信息是作為XML流中的標記數據通過HTTP發送的從Web服務的角度來 看SOAP可以看作一種客戶端或服務器實現
soap客戶端和服務器SOAP客戶端是一種創建XML文檔的程序該XML文檔包含在分布式系 統遠程調用方法所需的信息SOAP客戶端不是傳統意義上的程序它除 了用作普通的桌面應用程序外還可以是一種Web服務器或基於服務器 的應用程序
來自soap客戶端的消息和請求一般是通過http發送的因而soap 文檔可以穿過幾乎所有的防火牆從而能跨越不同的平台交換信息
soap服務器只是用於監聽soap消息的特殊代碼它可用作soap文檔的 分配器和解釋器外部web服務可以與基於jee技術的應用程序服務器交 互這種應用程序服務器可以處理多種客戶端的soap請求
soap服務器確保通過http連接接收的文檔被轉換成可以被另一端對 象理解的語言由於所有的通信都采用xml格式某種語言(比如說 java)中的對象可以通過soap與另一種語言(如c++)中的對象通信 soap服務器的工作就是確保各端都能理解??並且滿意??為它們提供 服務的soap
soap和java技術根據SOAP 規范SOAP是一種用於在分散的分布式環境中交換 信息的輕型協議SOAP不會委托單一的編程模型??也不會為特定的 編程語言定義語言綁定在Java編程語言環境中它取決於Java團隊來 定義特定的語言綁定現在Java語言綁定通過JAXRPC來集中定義
在最近的javaone開發人員討論會上對soap的討論中sun公司的工程 師roberto chinnici和rahul sharma把jax技術家庭的作用定義成使用 熟悉的用於java平台的jsp和ejb組件技術創建web服務servlets 和無狀態會話bean被引用作兩種最可能用於封裝web服務的java技術
什麼是soap?真的嗎?
我們已經徹底設置好了SOAP舞台並描述了其在Web服務中至關重要的作用 現在進一步看看SOAP到底是什麼它執行什麼任務以及是怎樣執行的?
soap是一種可擴展的基於文本的架構它允許在不同角色之間通信這裡的 角色一般是指對象它們先前並不了解對方或對方所在的平台從網絡對象的角 度來看soap是它們的最後不可見形式客戶端應用程序可以在松耦合的環境中 互操作以發現和動態地連接到服務而這並不需要事先在應用程序與服務之間 建立一種協定
soap是可擴展的這是因為無需中斷已有的應用程序soap客戶端服務器和 協議自身都能發展而且soap能極好地支持中間介質和層次化的體系結構這意 味著處理節點可以把請求的路徑置於客戶端與服務器之外中間節點通過使用報 頭(用於標識哪個節點處理哪部分消息)來處理soap指定的各部分消息這種類 型的中間報頭處理是通過客戶端應用程序與中間處理節點之間的私人契約來執行 的soap為報頭提供了一個mustunderstand屬性它允許客戶端將 處理指定為是必須執行的還是可選的如果mustunderstand被設置 為服務器必須執行報頭指定的中間處理或給出錯誤
soap還定義了數據編碼規則稱為基准編碼或section (第節)編碼 它是出自soap規范中描述數據編碼規則的那一節內容應當指出soap編碼的內容 占了soap 規范頁中的大部分篇幅不必深入到xml數據類型細節??它仍然 是xml架構制定組的專家們研究的范疇??soap編碼可以簡短地描述成簡單值或復 合值的集合
簡單值可以是簡單類型如整型浮點型和字符型或者是xml架構規范第部 中定義的內置類型包括各種數據類型如字節型數組和枚舉
復合值包括結構數組和xml架構制定組定義的復雜類型最後當然不是至 少soap數據編碼指定了對象序列化規則即通過網絡排列和分散數據流的機制 這些section 編碼在任何情況下都不是強制性的注意這點很重要這樣客 戶端和服務器可以自由地使用不同的數據編碼規范只要它們符合格式就行但 是這樣做的話就會毀滅soap在網絡上提供標准化服務所起的推動作用並且會 帶來一個常見的警告已偏離航線太遠單獨的客戶端和服務器可以選擇較短的 旅行路線
最後soap建立了一組規則它允許客戶端和服務器把soap用作一種通信架構 來執行遠程過程調用soap??作為一種面向消息的協議??可以使用這些規范 像rpc類型的型一樣良好地工作對象序列化的機制給soaprpc提供了活力
消息格式SOAP在標准化消息格式環境中可以做所有它能完成的工作消息的主體部分 是text/xml形式的MIME類型並且包含一個SOAP封套該封套是一個XML文 檔封套包含了報頭(可選的)和報文(必須有的)封套的報文部分總是用於 最終接收的消息而報頭項目可以確定執行中間處理的目標節點附件二進制 數字及其他項目可以附加到報文上
soap提供了一種讓客戶端指定哪個中間處理節點必須處理報頭項目的方法由 於報頭與soap消息的主體內容是互不相關的所以可用它們給消息添加信息而 不會影響對消息報文的處理
例如報頭可用於為報文中包含的請求提供數字簽名在這種情形下身份驗 證/授權服務器可以處理報頭項目??獨立於報文??可以剝離信息以驗證簽名 一旦通過驗證封套的其余部分將被傳遞給soap服務器它將對消息的報文進行 處理深入研究一下soap封套有助於明了soap報頭和報文元素的位置和用途
剖析soap封套SOAP 規范提供了下面的封套示例
<soapenv envelope xmlnsSOAPENV=SOAPENVencodingStyle=> <SOAPENVHeader> <tTransaction xmlnst=someURI> SOAPENVmustUnderstand= </tTransaction> </SOAPENVHeader> <SOAPENVBody> <mGetLastTradePrice xmlnsm=someURI> <symbol>DEF</Symbol> </m GetLastTradePrice> </SOAPENVBody> </SOAPEnvelope>
在這個例子中getlasttradeprice請求被傳送給網絡上某個位置的一個存儲 引用服務該請求帶有一個字符型參數一個訂單符號並在soap響應中返回一 個浮點數
soap封套是表示soap消息的xml文檔的頂層元素xml命名空間用於將soap標識 符與應用程序的特定標識符區分開xml命名空間在soap中使用很頻繁以把消息 的元素的作用域限制在一個特定的領域理解soap命名空間有助於熟悉xml命名空 間規范如果您沒有理解命名空間也可以簡單地把它看作一種鄰近的標識符 它通過把soap元素與特定的位置(真實的或想像的)相關聯從而有助於惟一地 標識soap元素
命名空間上面例子中的第一個命名空間參照了在SOAP消息中定義元素和屬性的SOAP模式 第二個命名空間參照了SOAP編碼即前文中討論過的Section 數據類型 由於沒有指定額外的通用元素編碼這種編碼將適用於整篇文檔
報頭在SOAP封套報頭示例中標識的第一個元素是一個transaction(交易)元素它 帶有一個命名空間屬性和一個值為的mustUnderstand 屬性既然mustUnderstand的屬性值設為 接受該消息的服務器必須在該transaction節點上執行中間處理您可以對此 作這樣的解釋服務器與客戶端事先已就管理該報頭元素處理的語義達成了一 致因而服務器確切地知道要處理的元素的內容本例中元素的內容是
如果接收消息的服務器不理解transaction報頭的語義它就會拒絕請求並拋出 一個錯誤錯誤元素是soap報文和定義良好的機制的一個特殊部分用於把錯誤信 息送回給客戶端
像這樣的中間處理節點是soap可擴展性的一個例子客戶端在soap消息中包含 這樣的節點以在可以處理消息的報文內容前指示要發生的特殊的處理需要 要保證向後兼容不能提供這種處理的現有的服務器只需把mustunderstand 屬性設置為它使操作是可選的
除了定義像上例中所示的transaction節點外soap消息還可包含報頭項目 它們用於指定節點執行身份驗證處理加密狀態的永久性業務邏輯處理等 報頭有助於把soap構建成一種可擴展的模態包模型只需記住報頭處理是完全獨 立於soap消息的報文的
報文上面例子中的SOAP報文包含一個XML載荷我們可以推測RPC沒有為我們對其作 詳細解釋SOAP不僅是一種模態包模型它還是一種相當神秘的包模型
沒有什麼跡象清楚地顯示rpc將要開始做什麼我們在報文中所看到的是幾個 xml元素其中一個用命名空間進行了限制它取決於soap服務器理解文檔語義並 執行正確的處理事實上服務器提供了一種架構以有意義的方式處理xml載 荷這裡的有意義意味著服務器在某些後台數據庫上調用遠程過程以為消 息報文中包含的股票符號元素接收股票價格所有這些魔術般的操作都是在soap rpc幕後發生的
soaprpc SOAP消息本質上是一種從發送方到接收方的單向傳輸但是SOAP經常組合到實 現請求/響應機制中要讓RPC使用SOAP必須遵循幾條規則首先請求和響應 消息必須被編碼成結構類型對一個操作的每一個輸入參數都必須有一個同名 元素(或輸入結構的成員)作為參數對每一個輸出參數都必須有一個名稱匹 配的元素(或輸出結構的成員)
基於rpc的觀點會省略一些更早一點顯示的soap消息只帶有報文部分的 soap請求與響應封套如下所示
請求<SOAPENVBody> <mGetLastTradePrice xmlnsm=someURI> <symbol>DEF</Symbol> </mGetLastTradePrice> </SOAPENVBody>
響應<SOAPENVBody> <mGetLastTradePriceResponse xmlnsm=someURI> <price></price> </m GetLastTradePriceResponse> </SOAPENVBody>
請求要調用getlasttradeprice方法注意響應定義了 getlasttradepriceresponse操作對附加響應到響應操作尾部的 一個常用的soap調用規則是創建響應結構這種輸出結構包含一個名稱為 price的元素它返回方法調用的結果假定為浮點型
在soap封套中沒有什麼地方的數據類型是顯式聲明的注意到這一點很重要 這樣如果只查看soap消息就不會知道符號類型或結果參數price(價格)的類 型客戶端應用程序一般通過section 編碼定義數據類型或通過與服務器 私下達成的協議來定義數據類型在任何一種情況下這些包含在soap消息中的 定義都不是顯式的
最後為了進行rpc需要一種低級協議如http盡管soap 規范強制要求 使用http作為傳輸協議但soap 規范(及其姊妹規范帶有附件的soap消息 )允許使用ftpsmtp甚至(可能)原始的tcp/ip套接字所有這些對soap通用 的序列化和編碼規則也適用於rpc參數
soap用例
圖SOAP用例處理步驟用(單擊圖片可將其放大)
現在您看到的就是詳細的SOAP封套圖它能幫助我們後退一步從用例的角度觀 察SOAP以幫助我們領會在分布式Web環境中一個來回的處理過程此處列出了幾 條構成Web服務和SOAP的概念中樞的顯目的概括性命題
internet上某些地方的客戶端應用程序使用web服務
Web服務(通過SOAP)顯示對象方法
對象方法訪問Web上任意位置的遠程數據
對這些網絡命題應用傳遞邏輯我們可以為Web服務和SOAP下一個總的結論 某些位置的客戶端可以使Web上任意位置的數據這就是所要證明的
下面是更加詳細一點的用例
soap客戶端使用uddi注冊來查找web服務不用直接操作wsdl大多數情況 下soap應用程序將硬連接到使用特定類型的端口和特定樣式的綁定並且它將 通過uddi動態配置要調用的與發現的web服務匹配的服務地址
客戶端應用程序創建SOAP消息它是一個可執行想要的請求/響應操作的 XML文檔
客戶端把SOAP消息傳送給監聽SOAP請求的Web服務器上的JSP或ASP頁面
SOAP服務器解析SOAP包並在其領域調用合適的對象方法在SOAP文檔中包 含的參數中傳遞在SOAP服務器接收消息之前中間處理節點可以執行SOAP報 頭指示的特殊功能可視情況確定是否執行這步操作
請求對象執行指示的功能並返回數據給SOAP服務器它把響應打包到 SOAP封套中服務器把SOAP封套包裹在要發送回請求機器的響應對象中如 servlet或COM對象
客戶端接收對象剝離出SOAP封套並把響應文檔發送給最初發出請求的程 序完成請求/響應循環
小結SOAP是一種基於XML的協議它用於在分布式環境中發送消息並執行遠程過 程調用使用SOAP不用考慮任何特定的傳輸協議(盡管通常選用HTTP協議) 就能使數據序列化
用soap來構建平台與語言中性的互操作系統是一個好的選擇總之soap和 web服務已為在xml上構建分布式應用程序基礎結構所需的一切都考慮好了通過 解決com和java組件對象模型之間的沖突soap把多個平台在訪問數據時所出現的 不兼容性問題減至最少
先把這些討論放在一邊soap是一種適用於所有類型的對象實體的理想的媒介 ??即使對於像brad pitt和edward norton之類的好萊塢電影角色??也可用作 一種通信媒介就像在電影中一樣期待著這種新技術帶來震撼世界的效果
參考文獻《A Framework for Using Web Services》作者Simeon Simonov刊登 《XML》雜志第卷第期上
《soap in the java platform introducing the jaxrpc technology》 roberto chinnici和rahul sharma在年月的javaone開發人員討論會上的 演講稿
《理解soap》作者kennard scribner和marc c stiver sams出 版社年出版(這本書非常吸引人該書的兩位作者從高度的技術層面揭示 soap和網絡技術該書以流暢的風格從最低層次的細節角度宣揚了呆在一個 地方做所有的工作的理念該書是具有xml和web服務經驗的開發人員成為 soap專家必讀的經典力作)
《writing your first web service》 作者 andy mccright 刊登在年 月預發行的《web服務》雜志上
《xml and soap programming for biztalk servers》 作者 brian e travis microsoft 出版社出版 (不要讓這本書的書名迷惑了你 這是一本優秀的介紹web服務和soap的中高級書籍 其內容精彩結構組織非 常優秀 其中介紹biztalk最基本知識的內容占了全書很大比例是一本適合於 初學者閱讀的經典的著作
作者介紹Tom Clements是一名技術類書籍和詩歌自由撰稿人擅長於Java APIXML/XSLT設備驅動程序及無線通信等技術
From:http://tw.wingwit.com/Article/program/net/201311/12691.html