SOAP(Simple Object access PRotoco)簡(jiǎn)單對(duì)象訪問協(xié)議是在分散或分布式的環(huán)境中交換信息的簡(jiǎn)單的協(xié)議,是一個(gè)基于 xml 的協(xié)議。此協(xié)議規(guī)范由 IBM、Microsoft、UserLand 和 DevelopMentor 在1998年共同提出,并得到 IBM,蓮花(Lotus),康柏(Compaq)等公司的支持,于2000年提交給萬維網(wǎng)聯(lián)盟(World Wide Web Consortium;W3C)。現(xiàn)在,SOAP 協(xié)議規(guī)范由萬維網(wǎng)聯(lián)盟的 XML工作組維護(hù)。SOAP 1.2 版在2003年6月24日成為 W3C 的推薦版本。
SOAP 協(xié)議包括以下四個(gè)部分的內(nèi)容:
SOAP 消息基本上是從發(fā)送端到接收端的單向傳輸,但它們常常結(jié)合起來執(zhí)行類似于請(qǐng)求 / 應(yīng)答的模式。所有的 SOAP 消息都使用 XML 編碼。一條 SOAP 消息就是一個(gè)包含有一個(gè)必需的 SOAP 的封裝包,一個(gè)可選的 SOAP 標(biāo)頭(Header)和一個(gè)必需的 SOAP 體塊(Body)的 XML 文檔。
把 SOAP 綁定到 HTTP 提供了同時(shí)利用 SOAP 的樣式和分散的靈活性的特點(diǎn)以及 HTTP 的豐富的特征庫的優(yōu)點(diǎn)。在HTTP上傳送 SOAP 并不是說 SOAP 會(huì)覆蓋現(xiàn)有的 HTTP 語義,而是 HTTP 上的 SOAP 語義會(huì)自然的映射到 HTTP 語義。在使用 HTTP 作為協(xié)議綁定的場(chǎng)合中, RPC 請(qǐng)求映射到 HTTP 請(qǐng)求上,而 RPC 應(yīng)答映射到 HTTP 應(yīng)答。然而,在 RPC 上使用 SOAP 并不僅限于 HTTP 協(xié)議綁定。SOAP也可以綁定到TCP和UDP協(xié)議上。
雖然這四個(gè)部分都作為 SOAP 的一部分,作為一個(gè)整體定義的,但他們?cè)诠δ苌鲜窍嘟坏摹⒈舜霜?dú)立的。特別的,信封(envelop)和編碼規(guī)則(encoding rules)是被定義在不同的 XML 命名空間中,這樣使得定義更加簡(jiǎn)單。
SOAP 消息的格式比較簡(jiǎn)單,如下圖:
下面是一條 SOAP 消息的基本格式:
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Header> <!-- 消息頭,可選 --> </soap:Header> <soap:Body> <!-- 消息內(nèi)容,必需 --> <soap:Fault> <!-- 錯(cuò)誤信息,可選 --> </soap:Fault> </soap:Body></soap:Envelope>
一條 SOAP 消息就是一個(gè)普通的 XML 文檔,包含如下元素:
Envelope
是 SOAP 消息結(jié)構(gòu)的主要容器,也是 SOAP 消息的根元素,它必須出現(xiàn)在每個(gè) SOAP 消息中,用于把此 XML 文檔標(biāo)示為一條 SOAP 消息。
在 SOAP 中,使用命名空間將 SOAP 消息元素與應(yīng)用程序自定義的元素區(qū)分開來,將 SOAP 消息元素的作用域限制在一個(gè)特定的區(qū)域。
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"></soap:Envelope>
SOAP 的 encodingStyle
屬性用于定義在文檔中使用的數(shù)據(jù)類型。此屬性可出現(xiàn)在任何 SOAP 元素中,并會(huì)被應(yīng)用到元素的內(nèi)容及元素的所有子元素上。
這個(gè)是可選的,如果需要添加 Header
元素,那么它必須是 Envelope
的第一個(gè)子元素。Header
還可以包含0個(gè)或多個(gè)可選的子元素,這些子元素稱為 Header 項(xiàng),所有的 Header 項(xiàng)一般來說是屬于某個(gè)特定與接口相關(guān)的命名空間。
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Header> <AuthenHeader xmlns="http://www.example.com"> <sAuthenticate>string</sAuthenticate> </AuthenHeader> </soap:Header> <soap:Body> </soap:Body></soap:Envelope>
Header
元素用于與消息一起傳輸一些附加的消息,如身份驗(yàn)證信息等。
SOAP 消息的 Body
元素可以包含以下任何元素:
所有 Body
元素的直接子元素都稱為 Body 項(xiàng),所有 Body 項(xiàng)一般是屬于某個(gè)特點(diǎn)的命名空間的。
SOAP 請(qǐng)求消息例子:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Body> <getMobileCodeInfo xmlns="http://www.example.com"> <mobileCode>string</mobileCode> <userID>string</userID> </getMobileCodeInfo> </soap:Body></soap:Envelope>
SOAP 響應(yīng)消息例子:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Body> <getMobileCodeInfoResponse xmlns="http://www.example.com"> <getMobileCodeInfoResult>string</getMobileCodeInfoResult> </getMobileCodeInfoResponse> </soap:Body></soap:Envelope>
注:以上例子表示通過手機(jī)號(hào)獲取手機(jī)號(hào)歸屬地等信息。第一個(gè)例子是請(qǐng)求消息,第二個(gè)例子是它的響應(yīng)消息。
Fault
元素用于在 SOAP 消息中傳輸錯(cuò)誤及狀態(tài)信息。如果 SOAP 消息中包括 Fault
元素,它必須作為一個(gè) Body
的子元素出現(xiàn),而且至多出現(xiàn)一次。Fault
元素本身也包含有描述錯(cuò)誤詳細(xì)信息的子元素。它包含以下子元素:faultcode
,faultstring
,faultactor
,detail
。
子元素 | 描述 |
---|---|
faultcode | 供識(shí)別故障的代碼 |
faultstring | 可供人閱讀的有關(guān)故障的說明 |
faultactor | 有關(guān)是誰引發(fā)故障的信息 |
detail | 有關(guān)涉及 Body 元素的應(yīng)用程序?qū)S缅e(cuò)誤信息 |
其中 faultcode
是每一條錯(cuò)誤消息都會(huì)提供的元素,它的值一般是以下錯(cuò)誤代碼之一:
錯(cuò)誤代碼 | 描述 |
---|---|
VersionMismatch | 無效的 SOAP Envelope 命名空間 |
MustUnderstand | 無法理解 Header 中擁有屬性 mustUnderstand = 1 的子元素 |
Client | 消息結(jié)構(gòu)錯(cuò)誤,或包含了不正確的信息 |
Server | 服務(wù)器出現(xiàn)錯(cuò)誤 |
注:以上關(guān)于 SOAP Fault 的描述不完全適用于 SOAP 1.2 版本。因?yàn)?SOAP 1.2 版本在返回錯(cuò)誤信息時(shí),Fault
的子元素及其內(nèi)容已經(jīng)有所不同。具體看下面的例子:
SOAP v1.1 錯(cuò)誤消息例子:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body> <soap:Fault> <faultcode>soap:Client</faultcode> <faultstring>Input string was not in a correct format.</faultstring> <detail/> </soap:Fault></soap:Body></soap:Envelope>
SOAP v1.2 錯(cuò)誤消息例子:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Body> <soap:Fault> <soap:Code> <soap:Value>soap:Sender</soap:Value> </soap:Code> <soap:Reason> <soap:Text xml:lang="en">Input string was not in a correct format.</soap:Text> </soap:Reason> <soap:Detail/> </soap:Fault> </soap:Body></soap:Envelope>
從以上返回結(jié)果來看,其實(shí)所返回的錯(cuò)誤信息內(nèi)容并沒有太多改變,只是 XML 的元素發(fā)生了一些變化,具體還需要讀者自己理解。
本文章節(jié)有點(diǎn)亂,還算是把 SOAP 的基本知識(shí)點(diǎn)都過了一遍。接下來,我將會(huì)結(jié)合一些實(shí)例,進(jìn)一步說明 SOAP 的特點(diǎn)以及如何使用 SOAP Web 服務(wù)。(本文已存檔 Github)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注