一、SOAP概述

      SOAP(Simple Object Access Protocol),它是一種標準消息傳遞協議,通常是Web Service的事實標準。SOAP是以XML為基礎,SOAP消息格式是由XML Schema模式定義,通過XML命名空間使SOAP具有很強的擴展性。
      SOAP message:SOAP XML文檔實例,通常通過其他某些網絡協議的有效載荷來攜帶SOAP消息,例如:HTTP, SMTP, TCP/IP等。
      WebService可以使用兩種消息傳遞方式:One-Way messaging(單向消息傳遞)或者Request/Response messaging(請求/響應消息傳遞)

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

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

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

    4.2 mustUnderstand屬性
          表示處理是否為強制性處理,如果一個節點不能識別某一個強制性Header,那么必定會產生SOAP錯誤。
          如果MustUnderstand屬性的值是0,如果應用程序沒有能夠識別該文件頭,那么必須刪除此文件頭。

五、SOAP體
       Body元素要包含應用程序專有的數據或者錯誤消息。應用程序的專有數據可以是任意XML數據或者是提供給過程調用的任意參數。只有SOAP消息最后的接收方應該處理SOAP Body。

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

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

       6.2 RPC/Literal消息傳遞模式
             RPC/Literal消息傳遞模式將Body元素格式化成struct。PRC請求消息包含調用的方法名稱與輸入參數。RPC響應消息則包含返回值和各種輸出參數(或者錯誤);

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: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消息的有效負載:即XML文檔段或者是遠程過程調用對應的參數和返回值的XML表示。
            Messaging Exchange Patterns (MEPs):One-Way and Request/Response MEPs。消息交換模式表示的是消息的流向,而不是消息的內容

七、SOAP錯誤
       SOAP錯誤是由消息接收方(消息的中介體或者最終接收方)產生的。只有使用的請求/響應消息傳遞模式的時候,才要去接收方將SOAP錯誤傳遞給發送方。

       7.1 faultcode元素
            faultcode表示錯誤錯誤代碼,包括Client、Server、VersionMismatch和MustUnderstand不同類型。
            Client表示傳遞SOAP消息的節點出現了錯誤(發送錯誤),例如:消息不是一個良好的格式,或者包含無效數據、缺少所期望的信息,接收節點就會產生一個Client錯誤。
            Server表示接收到SOAP消息的節點發生故障或者不能處理SOAP消息(中介體或者最終接收方引起的錯誤)。例如:當接收節點處理SOAP消息不能連接到數據庫等資源,就會產生一個Server錯誤。
            VersionMismatch表示接收節點不能識別SOAP消息的Envelope元素的命名空間,例如:SOAP 1.1的節點接收到SOAP1.2消息。
            MustUnderstand表示節點不能識別“MustUnderstand=1”指定的header,就會產生這個類型的fault。
            還有一些非標準的錯誤信息例如:

          <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表示錯誤的描述,是強制性元素,可以使用特殊屬性xml:lang表示文本消息使用的語言。

        7.3 faultactor元素
              faultactor表示遇到錯誤并且產生錯誤的節點,如果錯誤節點是一個中介節點,那么需要使用faultactor元素,但是如果錯誤節點是最終接收方,則該元素可選。
 
        7.4 detail元素

       如果Body元素的內容產生錯誤,必須包含錯誤消息的detail元素,但是如果文件頭發生錯誤,則不能包含該元素

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

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

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