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ò)誤);













































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ò)誤信息例如:


<faultcode>wsse:InvalidSecurityToken</faultcode>




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í),必須使用此代碼。