Web Service理論-SOAP
Posted on 2008-07-04 17:23 acooly 閱讀(1961) 評(píng)論(0) 編輯 收藏 所屬分類: WebService相關(guān)什么是WebServcie
??? 網(wǎng)上有很多解釋版本。我是技術(shù)研發(fā),所以個(gè)人理解從技術(shù)角度說(shuō):Web Service是一種輕量級(jí)別的基于XML的跨平臺(tái)遠(yuǎn)程服務(wù)通訊框架技術(shù),可以很好解決各平臺(tái)和語(yǔ)言間的數(shù)據(jù)通訊。
- 語(yǔ)意協(xié)議:使用基于XML的SOAP協(xié)議,定義業(yè)務(wù)數(shù)據(jù)格式。
- 傳輸協(xié)議:使用HTTP,TPC/IP,FTP,SMTP和JMS等,一般采用和支持較多的是HTTP。
- 接口描述語(yǔ)言:使用基于XML的WDSL作為統(tǒng)一服務(wù)描述。
SOAP
簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SOAP:Simple Object Access Protocol)是一種輕量的、簡(jiǎn)單的、基于 XML 的協(xié)議,它被設(shè)計(jì)成在 WEB 上交換結(jié)構(gòu)化的和固化的信息。主要負(fù)責(zé)在WEBSERVICE服務(wù)中通訊報(bào)文數(shù)據(jù)格式的定義。 SOAP 可以和現(xiàn)存的許多因特網(wǎng)協(xié)議和格式結(jié)合使用,包括超文本傳輸協(xié)議( HTTP),簡(jiǎn)單郵件傳輸協(xié)議(SMTP),多用途網(wǎng)際郵件擴(kuò)充協(xié)議(MIME),傳統(tǒng)SOCKET通訊(TCP/IP),JAVA消息系統(tǒng)(JMS)等傳輸協(xié)議。它還支持從消息系統(tǒng)到遠(yuǎn)程過(guò)程調(diào)用(RPC)等大量的應(yīng)用程序。
SOAP 包括三個(gè)部分:
- SOAP 封裝:它定義了一個(gè)框架,該框架描述了消息中的內(nèi)容是什么,誰(shuí)應(yīng)當(dāng)處理它以及它是可選的還是必須的。
- SOAP 編碼規(guī)則:它定義了一種序列化的機(jī)制,用于交換應(yīng)用程序所定義的數(shù)據(jù)類型的實(shí)例。
- SOAP RPC 表示:它定義了用于表示遠(yuǎn)程過(guò)程調(diào)用和應(yīng)答的協(xié)定。
SOAP 消息基本上是從發(fā)送端到接收端的單向傳輸,但它們常常結(jié)合起來(lái)執(zhí)行類似于請(qǐng)求 / 應(yīng)答的模式。所有的 SOAP 消息都使用 XML 編碼。一條 SOAP 消息就是一個(gè)包含有一個(gè)必需的 SOAP 的封裝包,一個(gè)可選的 SOAP 標(biāo)頭和一個(gè)必需的 SOAP 體塊的 XML 文檔。
把 SOAP 綁定到 HTTP 提供了同時(shí)利用 SOAP 的樣式和分散的靈活性的特點(diǎn)以及 HTTP 的豐富的特征庫(kù)的優(yōu)點(diǎn)。在 HTTP 上傳送 SOAP 并不是說(shuō) SOAP 會(huì)覆蓋現(xiàn)有的 HTTP 語(yǔ)義,而是 HTTP 上的 SOAP 語(yǔ)義會(huì)自然的映射到 HTTP 語(yǔ)義。在使用 HTTP 作為協(xié)議綁定的場(chǎng)合中, RPC 請(qǐng)求映射到 HTTP 請(qǐng)求上,而 RPC 應(yīng)答映射到 HTTP 應(yīng)答。簡(jiǎn)單的說(shuō)就是,通過(guò)HTTP POST(當(dāng)然也可以GET或其它,一般是POST)方式傳輸一個(gè)SOAP協(xié)議定義的報(bào)文數(shù)據(jù)體,用于雙向通訊。然而,在 RPC 上使用 SOAP 并不僅限于 HTTP 協(xié)議綁定,也可以和其他的現(xiàn)行傳輸協(xié)議綁定。
語(yǔ)法規(guī)則
- SOAP 消息必須用 XML 來(lái)編碼
- SOAP 消息必須使用 SOAP Envelope 命名空間
- SOAP 消息必須使用 SOAP Encoding 命名空間
- SOAP 消息不能包含 DTD 引用
- SOAP 消息不能包含 XML 處理指令
SOAP報(bào)文結(jié)構(gòu)
一條 SOAP 消息就是一個(gè)普通的 XML 文檔,包含下列元素:
- 必需的 Envelope標(biāo)簽,文檔的ROOT,可把此 XML 文檔標(biāo)識(shí)為一條 SOAP 消息
必需的 SOAP 的 Envelope 元素是 SOAP 消息的根元素。它可把 XML 文檔定義為 SOAP 消息 - 可選的 Header標(biāo)簽,包含頭部信息
可選的 SOAP Header 元素可包含有關(guān) SOAP 消息的應(yīng)用程序?qū)S眯畔ⅲū热缯J(rèn)證、支付等)。如果 Header 元素被提供,則它必須是 Envelope 元素的第一個(gè)子元素。 - 必需的 Body標(biāo)簽,包含所有的調(diào)用和響應(yīng)信息
必需的 SOAP Body 元素可包含打算傳送到消息最終端點(diǎn)的實(shí)際 SOAP 消息。
SOAP Body 元素的直接子元素可以是合格的命名空間。SOAP 在默認(rèn)的命名空間中("http://www.w3.org/2001/12/soap-envelope")定義了 Body 元素內(nèi)部的一個(gè)元素。即 SOAP 的 Fault 元素,用于指示錯(cuò)誤消息。
- 可選的 Fault 元素,提供有關(guān)在處理此消息所發(fā)生錯(cuò)誤的信息
來(lái)自 SOAP 消息的錯(cuò)誤消息被攜帶于 Fault 元素內(nèi)部。
如果已提供了 Fault 元素,則它必須是 Body 元素的子元素。在一條 SOAP 消息中,F(xiàn)ault 元素只能出現(xiàn)一次。
SOAP 的 Fault 元素用于下列子元素:
子元素 描述 <faultcode> 供識(shí)別故障的代碼 <faultstring> 可供人閱讀的有關(guān)故障的說(shuō)明 <faultactor> 有關(guān)是誰(shuí)引發(fā)故障的信息 <detail> 存留涉及 Body 元素的應(yīng)用程序?qū)S缅e(cuò)誤信息
<SOAP-ENV:Envelope?xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" //SOAP報(bào)文默認(rèn)命名空間
?????????????????? xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" //編碼數(shù)據(jù)類型命名空間
?????????????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"//文檔XSD實(shí)例方案,規(guī)定格式
?????????????????? xmlns:xsd="http://www.w3.org/2001/XMLSchema">???????? //文檔XSD方案,規(guī)定格式
??? <!-- 信頭 -->
??? <SOAP-ENV:HEADER></SOAP-ENV:HEADER>
??? <!-- 信體 -->
??? <SOAP-ENV:Body>
????????<m:activateEpurse?xmlns:m="http://service.payment.ipayment.justinmobile.com">
????????????<m:appNo>String</m:appNo>
????????????<m:mobileNo>String</m:mobileNo>
????????</m:activateEpurse>
????</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP應(yīng)答報(bào)文(返回一個(gè)entry數(shù)組,也就是MAP)
????<soap:Body>
????????<ns1:activateEpurseResponse?xmlns:ns1="http://service.payment.ipayment.justinmobile.com">
????????????<ns1:out>
????????????????<entry?xmlns="http://service.payment.ipayment.justinmobile.com">
????????????????????<key>transStatus</key>
????????????????????<value>0001</value>
????????????????</entry>
????????????</ns1:out>
????????</ns1:activateEpurseResponse>
????</soap:Body>
</soap:Envelope>
所有以上的元素均被聲明于針對(duì) SOAP 封裝的默認(rèn)命名空間中:
http://www.w3.org/2001/12/soap-envelope
SOAP 在默認(rèn)的命名空間中 ("http://www.w3.org/2001/12/soap-envelope") 定義了三個(gè)屬性。這三個(gè)屬性是:actor、 mustUnderstand 以及 encodingStyle。這些被定義在 SOAP 頭部的屬性可定義容器如何對(duì) SOAP 消息進(jìn)行處理。
actor
通過(guò)沿著消息路徑經(jīng)過(guò)不同的端點(diǎn),SOAP 消息可從某個(gè)發(fā)送者傳播到某個(gè)接收者。并非 SOAP 消息的所有部分均打算傳送到 SOAP 消息的最終端點(diǎn),不過(guò),另一個(gè)方面,也許打算傳送給消息路徑上的一個(gè)或多個(gè)端點(diǎn)。
SOAP 的 actor 屬性可被用于將 Header 元素尋址到一個(gè)特定的端點(diǎn)。
soap:actor="URI"
mustUnderstand
SOAP 的 mustUnderstand 屬性可用于標(biāo)識(shí)標(biāo)題項(xiàng)對(duì)于要對(duì)其進(jìn)行處理的接收者來(lái)說(shuō)是強(qiáng)制的還是可選的。
假如您向 Header 元素的某個(gè)子元素添加了 "mustUnderstand="1",則它可指示處理此頭部的接收者必須認(rèn)可此元素。假如此接收者無(wú)法認(rèn)可此元素,則在處理此頭部時(shí)必須失效。
soap:mustUnderstand="0|1"
encodingStyle
SOAP 的 encodingStyle 屬性用于定義在文檔中使用的數(shù)據(jù)類型。此屬性可出現(xiàn)在任何 SOAP 元素中,并會(huì)被應(yīng)用到元素的內(nèi)容及元素的所有子元素上。SOAP 消息沒(méi)有默認(rèn)的編碼方式。
soap:encodingStyle=" 以及針對(duì) SOAP 編碼和數(shù)據(jù)類型的默認(rèn)命名空間: http://www.w3.org/2001/12/soap-encoding