一、SOAP概述

      SOAP(Simple Object Access Protocol),它是一種標(biāo)準(zhǔn)消息傳遞協(xié)議,通常是Web Service的事實(shí)標(biāo)準(zhǔn)。SOAP是以XML為基礎(chǔ),SOAP消息格式是由XML Schema模式定義,通過(guò)XML命名空間使SOAP具有很強(qiáng)的擴(kuò)展性。
      SOAP message:SOAP XML文檔實(shí)例,通常通過(guò)其他某些網(wǎng)絡(luò)協(xié)議的有效載荷來(lái)攜帶SOAP消息,例如:HTTP, SMTP, TCP/IP等。
      WebService可以使用兩種消息傳遞方式:One-Way messaging(單向消息傳遞)或者Request/Response messaging(請(qǐng)求/響應(yīng)消息傳遞)

 二、SOAP的基本結(jié)構(gòu)
       SOAP中根元素是Envelope元素。Envelope元素中可以包含多個(gè)可選的Header元素,必須同時(shí)包含一個(gè)Body元素。Header元素必須是Envelope元素的直接子元素,并且要位于Body元素之前。

三、SOAP的命名空間
      SOAP消息可以在Header元素和Body元素中包含若干不同的XML元素,使用唯一的命名空間來(lái)標(biāo)識(shí)它們。
      xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/命名空間定義了標(biāo)準(zhǔn)SOAP元素(例如:Envelope, Header和Body等)。Header元素的每個(gè)頭文件都有自己的命名空間。

四、 SOAP頭
      SOAP header在Web Service中的應(yīng)用越來(lái)越多,例如安全性、事務(wù)以及其他各種服務(wù)方面的大量“標(biāo)準(zhǔn)”文件頭。SOAP文件頭是擴(kuò)展SOAP協(xié)議的一個(gè)功能非常強(qiáng)大的措施,SOAP文件頭的擴(kuò)展性是SOAP得以流行并且獲得其他協(xié)議沒有取得成功的另一個(gè)原因。
     
    4.1 actor屬性(next、ultimate receiver)
          Actor是由SOAP注釋定義的,在SOAP 1.2中,actor屬性已經(jīng)被更名為role。Actor屬性和XML命名空間組合在一起使用,以確定要用哪個(gè)代碼模塊處理具體的Header。
          Next角色表示消息路徑中的下一個(gè)節(jié)點(diǎn)必須處理文件頭。
          Ultimate receiver角色表示只有消息的最終接收方才能處理指定的Header。

    4.2 mustUnderstand屬性
          表示處理是否為強(qiáng)制性處理,如果一個(gè)節(jié)點(diǎn)不能識(shí)別某一個(gè)強(qiáng)制性Header,那么必定會(huì)產(chǎn)生SOAP錯(cuò)誤。
          如果MustUnderstand屬性的值是0,如果應(yīng)用程序沒有能夠識(shí)別該文件頭,那么必須刪除此文件頭。

五、SOAP體
       Body元素要包含應(yīng)用程序?qū)S械臄?shù)據(jù)或者錯(cuò)誤消息。應(yīng)用程序的專有數(shù)據(jù)可以是任意XML數(shù)據(jù)或者是提供給過(guò)程調(diào)用的任意參數(shù)。只有SOAP消息最后的接收方應(yīng)該處理SOAP Body。

六、SOAP消息傳遞模式
       SOAP支持四種消息傳遞模式(RPC/Literal, Document/ Literal, RPC/Encoded, and Document/Encoded),但是WS-I Basic Profile只允許RPC/Literal和Document/ Literal,不支持SOAP encoding,因?yàn)樗鼤?huì)引起嚴(yán)重的互操作性。Literal表示可以根據(jù)XML模式驗(yàn)證XML文檔的有效性。

       6.1 Document/ Literal消息傳遞模式
             Document/ Literal消息傳遞模式中,SOAP的Body元素包含一個(gè)XML格式良好的文檔段;

       6.2 RPC/Literal消息傳遞模式
             RPC/Literal消息傳遞模式將Body元素格式化成struct。PRC請(qǐng)求消息包含調(diào)用的方法名稱與輸入?yún)?shù)。RPC響應(yīng)消息則包含返回值和各種輸出參數(shù)(或者錯(cuò)誤);

SOAP請(qǐng)求消息:

<?xml version="1.0" encoding="UTF-8"?>

<soap:Envelope

 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"

 xmlns:mh
="http://www.Monson-Haefel.com/jwsbook/BookQuote">

   
<soap:Body>

      
<mh:getBookPrice>

          
<isbn>0321146182</isbn>

      
</mh:getBookPrice>

   
</soap:Body>

</soap:Envelope>

SOAP返回消息

<?xml version="1.0" encoding="UTF-8"?>

<soap:Envelope

 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"

 xmlns:mh
="http://www.Monson-Haefel.com/jwsbook/BookQuote" >

   
<soap:Body>

      
<mh:getBookPriceResponse>

          
<result>24.99</result>

      
</mh:getBookPriceResponse>

   
</soap:Body>

</soap:Envelope>


        6.3 消息傳遞模式和消息交換模式
            Messaging Modes:(RPC/Literal, Document/ Literal, RPC/Encoded, and Document/Encoded)。消息傳遞模式通常描述的是SOAP消息的有效負(fù)載:即XML文檔段或者是遠(yuǎn)程過(guò)程調(diào)用對(duì)應(yīng)的參數(shù)和返回值的XML表示。
            Messaging Exchange Patterns (MEPs):One-Way and Request/Response MEPs。消息交換模式表示的是消息的流向,而不是消息的內(nèi)容

七、SOAP錯(cuò)誤
       SOAP錯(cuò)誤是由消息接收方(消息的中介體或者最終接收方)產(chǎn)生的。只有使用的請(qǐng)求/響應(yīng)消息傳遞模式的時(shí)候,才要去接收方將SOAP錯(cuò)誤傳遞給發(fā)送方。

       7.1 faultcode元素
            faultcode表示錯(cuò)誤錯(cuò)誤代碼,包括Client、Server、VersionMismatch和MustUnderstand不同類型。
            Client表示傳遞SOAP消息的節(jié)點(diǎn)出現(xiàn)了錯(cuò)誤(發(fā)送錯(cuò)誤),例如:消息不是一個(gè)良好的格式,或者包含無(wú)效數(shù)據(jù)、缺少所期望的信息,接收節(jié)點(diǎn)就會(huì)產(chǎn)生一個(gè)Client錯(cuò)誤。
            Server表示接收到SOAP消息的節(jié)點(diǎn)發(fā)生故障或者不能處理SOAP消息(中介體或者最終接收方引起的錯(cuò)誤)。例如:當(dāng)接收節(jié)點(diǎn)處理SOAP消息不能連接到數(shù)據(jù)庫(kù)等資源,就會(huì)產(chǎn)生一個(gè)Server錯(cuò)誤。
            VersionMismatch表示接收節(jié)點(diǎn)不能識(shí)別SOAP消息的Envelope元素的命名空間,例如:SOAP 1.1的節(jié)點(diǎn)接收到SOAP1.2消息。
            MustUnderstand表示節(jié)點(diǎn)不能識(shí)別“MustUnderstand=1”指定的header,就會(huì)產(chǎn)生這個(gè)類型的fault。
            還有一些非標(biāo)準(zhǔn)的錯(cuò)誤信息例如:

          <soap:Body>
              
<soap:Fault>
                          <faultcode>wsse:InvalidSecurityToken</faultcode>
                     
<faultstring>An invalid security token was provided</faultstring>
                     
<detail/>
                
</soap:Fault>
          
</soap:Body>


        7.2 faultstring元素
              faultstring表示錯(cuò)誤的描述,是強(qiáng)制性元素,可以使用特殊屬性xml:lang表示文本消息使用的語(yǔ)言。

        7.3 faultactor元素
              faultactor表示遇到錯(cuò)誤并且產(chǎn)生錯(cuò)誤的節(jié)點(diǎn),如果錯(cuò)誤節(jié)點(diǎn)是一個(gè)中介節(jié)點(diǎn),那么需要使用faultactor元素,但是如果錯(cuò)誤節(jié)點(diǎn)是最終接收方,則該元素可選。
 
        7.4 detail元素

       如果Body元素的內(nèi)容產(chǎn)生錯(cuò)誤,必須包含錯(cuò)誤消息的detail元素,但是如果文件頭發(fā)生錯(cuò)誤,則不能包含該元素

八、SOAP和HTTP
        目前最常用SOAP的傳輸體是HTTP。大多數(shù)HTTP的傳輸由HTTP GET請(qǐng)求和HTTP應(yīng)答組成的,HTTP GET請(qǐng)求指定了請(qǐng)求的頁(yè)面,可以包含一些參數(shù),HTTP response作為有效負(fù)載返回到到請(qǐng)求方。另外,HTTP POST請(qǐng)求有效負(fù)載,所以適合攜帶SOAP消息。

        8.1 HTTP POST消息傳輸?shù)腟OAP
              HTTP POST消息必須包含SOAPAction文件字頭;SOAP1.2用(“application/soap+xml”) MIME類型替換SOAPAction文件頭。
              Content-Type是text/xml,表示有效負(fù)載是一個(gè)XML文檔。帶附件的SOAP會(huì)指定mulitpart/related,但是不推薦這樣做。

        8.2 HTTP響應(yīng)代碼
              200-level的HTTP成功代碼包括:
                     200 OK表示消息沒有錯(cuò)誤;包含一個(gè)正常的SOAP響應(yīng)消息。
                     200 Accepted:表示成功處理了請(qǐng)求,但是沒有SOAP響應(yīng)數(shù)據(jù),類似與void返回類型。
              400-level錯(cuò)誤
                     400 Bad Request:表示SOAP消息中的HTTP請(qǐng)求或者XML格式不正確
                     405 Method Not Allowed:如果不是通過(guò)HTTP POST方式傳遞的SOAP消息,返回此錯(cuò)誤。
                     415 Unsupported Media Type:text/xml值包含一個(gè)Content-Type文件頭,否則將返回此錯(cuò)誤。
              500 Internal Server Error:當(dāng)請(qǐng)求/響應(yīng)MEP中的響應(yīng)消息是SOAP錯(cuò)誤時(shí),必須使用此代碼。