SOAP 1.1 - 学习
SOAP 1.1 --- 每天發(fā)送SOAP request,不搞明白啥叫SOAP,慚愧
SOAP 1.1 XML 架構定義
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.xmlsoap.org/soap/envelope/" targetNamespace="http://schemas.xmlsoap.org/soap/envelope/" ><!-- Envelope, header and body --><xs:element name="Envelope" type="tns:Envelope" /><xs:complexType name="Envelope" ><xs:sequence><xs:element ref="tns:Header" minOccurs="0" /><xs:element ref="tns:Body" minOccurs="1" /><xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax" /></xs:sequence><xs:anyAttribute namespace="##other" processContents="lax" /></xs:complexType><xs:element name="Header" type="tns:Header" /><xs:complexType name="Header" ><xs:sequence><xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax" /></xs:sequence><xs:anyAttribute namespace="##other" processContents="lax" /></xs:complexType><xs:element name="Body" type="tns:Body" /><xs:complexType name="Body" ><xs:sequence><xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax" /></xs:sequence><xs:anyAttribute namespace="##any" processContents="lax" /></xs:complexType><!-- Global Attributes --><xs:attribute name="mustUnderstand" default="0" > <xs:simpleType><xs:restriction base='xs:boolean'><xs:pattern value='0|1' /></xs:restriction></xs:simpleType></xs:attribute><xs:attribute name="actor" type="xs:anyURI" /><xs:simpleType name="encodingStyle" ><xs:list itemType="xs:anyURI" /></xs:simpleType><xs:attribute name="encodingStyle" type="tns:encodingStyle" /><xs:attributeGroup name="encodingStyle" ><xs:attribute ref="tns:encodingStyle" /></xs:attributeGroup><xs:element name="Fault" type="tns:Fault" /><xs:complexType name="Fault" final="extension" ><xs:sequence><xs:element name="faultcode" type="xs:QName" /><xs:element name="faultstring" type="xs:string" /><xs:element name="faultactor" type="xs:anyURI" minOccurs="0" /><xs:element name="detail" type="tns:detail" minOccurs="0" /> </xs:sequence></xs:complexType><xs:complexType name="detail"><xs:sequence><xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax" /></xs:sequence><xs:anyAttribute namespace="##any" processContents="lax" /> </xs:complexType></xs:schema>如果檢查一下?Envelope?的?complexType?定義,你很快就能了解這些元素相互之間是如何關聯(lián)的。 以下消息模板說明了 SOAP Envelope 的結構:
<soap:Envelopexmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header> <!-- optional --><!-- header blocks go here... --></soap:Header><soap:Body><!-- payload or Fault element goes here... --> </soap:Body> </soap:Envelope>Envelope?元素始終是 SOAP 消息的根元素。 這就便于應用程序識別“SOAP 消息” — 只要檢查一下根元素的名稱即可。 通過檢查 Envelope 元素的命名空間,應用程序也可確定所使用的 SOAP 版本。
Envelope 元素包含一個可選的?Header?元素(有關詳細信息,參見可擴展性一節(jié)),后跟一個必要的?Body?元素。 Body 元素代表了該消息的有效內容。 它是一種通用容器,因為它可包含來自任何命名空間的任意數(shù)量的元素。 這就是試圖發(fā)送數(shù)據(jù)的最終目的地。
例如,以下的 SOAP 消息代表了一個在銀行帳戶之間轉帳的請求:
<soap:Envelopexmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><x:TransferFunds xmlns:x="urn:examples-org:banking"><from>22-342439</from><to>98-283843</to><amount>100.00</amount></x:TransferFunds></soap:Body> </soap:Envelope>如果接收方支持請求/響應,且能夠成功地處理該消息,它應向最初的發(fā)送方返回另一條 SOAP 消息。 在這種情況下,響應信息也應包含在 Body 元素中,如下例所示:
<soap:Envelopexmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><x:TransferFundsResponsexmlns:x="urn:examples-org:banking"><balances><account><id>22-342439</id><balance>33.45</balance></account><account><id>98-283843</id><balance>932.73</balance></account></balances></x:TransferFundsResponse></soap:Body> </soap:Envelope>該消息處理框架還定義了一個名為Fault?的元素,用于在發(fā)生錯誤時在 Body 元素中表示錯誤。 這是不可缺少的,因為如果沒有一種標準的錯誤表示方法,每個應用程序將不得不自己創(chuàng)建,從而使得通用基礎結構不可能區(qū)分成功和失敗。 以下示例 SOAP 消息中包含了一個 Fault 元素,指明在處理該請求時發(fā)生了“Insufficient Funds(資金不足)”錯誤:
<soap:Envelopexmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Insufficient funds</faultstring><detail><x:TransferError xmlns:x="urn:examples-org:banking"><sourceAccount>22-342439</sourceAccount><transferAmount>100.00</transferAmount><currentBalance>89.23</currentBalance></x:TransferError></detail></x:TransferFunds></soap:Body> </soap:Envelope>Fault 元素必須包含一個?faultcode,后跟一個?faultstring?元素。 faultcode 元素使用一種符合命名空間的名稱對錯誤進行分類,而 faultstring 元素提供一種對錯誤可讀的解釋(類似于 HTTP 的工作方式)。 表 2 簡要地說明了 SOAP 1.1 所定義的各種錯誤碼(所有這些代碼都包含在http://schemas.xmlsoap.org/soap/envelope/?命名空間中)。
Fault 元素也可能包含一個 detail 元素,以便提供該錯誤的細節(jié),這樣可以幫助客戶端診斷問題,特別是在 Client 和 Server 錯誤碼的情況下。
表 2. SOAP 1.1 錯誤碼
名稱
-
VersionMismatch
-
MustUnderstand
-
Client
-
Server
含義
-
處理方發(fā)現(xiàn) SOAP?Envelope?元素的命名空間是無效的。
-
處理方?jīng)]有理解或服從 SOAP Header 元素的某個直接子元素,而該子元素包含一個值為 "1" 的 SOAPmustUnderstand?屬性。
-
Client?類的錯誤表明消息的格式錯誤或者不包含適當?shù)男畔?#xff0c;因而不能成功。 這通常表明,如果不對該消息做出更改,就不應該重發(fā)該消息。
-
Server?類的錯誤表明該消息未能得到處理的原因與消息的內容并沒有直接關系,而是跟該消息的處理有關。 例如,處理過程可能包括與某個上游處理器的通信,但該處理器沒有響應。 如果在稍后重發(fā),該消息可能會成功。
現(xiàn)在,假設你想在初始的消息中增加一些驗證信息,以便接收方能夠確定發(fā)送方是否有足夠的權限來執(zhí)行傳輸。 要達到這一目的,一種方法就是在主體中添加憑證信息,如下所示:
<soap:Envelopexmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><x:TransferFunds xmlns:x="urn:examples-org:banking"><from>22-342439</from><to>98-283843</to><amount>100.00</amount><!-- security credentials --><credentials><username>dave</username><password>evad</password></credentials></x:TransferFunds></soap:Body> </soap:Envelope>如果使用這種方法,每項需要驗證的操作都必須處理這些憑證。 這也意味著其他需要安全性的應用程序必須開發(fā)自己的解決方案以解決這個問題;歸根結底,這將損害互操作性。 對于諸如安全性等公共需要,定義各方都同意的標準 SOAP 標頭將更有意義。 然后,各廠商可以在其通用的 SOAP 基礎結構中建立對擴展功能的支持,這樣各方皆贏。 這種方法可提高開發(fā)人員的生產(chǎn)力,同時有助于確保更高級別的互操作性。 而這正是 SOAP 擴展性模型設計要實現(xiàn)的目標。
轉載于:https://www.cnblogs.com/jack_at_blog/archive/2013/03/02/2939819.html
總結
以上是生活随笔為你收集整理的SOAP 1.1 - 学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 1380 坐标旋转
- 下一篇: IOS项目中加入Google Admob