什么是WebServcie
??? 網上有很多解釋版本。我是技術研發,所以個人理解從技術角度說:Web Service是一種輕量級別的基于XML的跨平臺遠程服務通訊框架技術,可以很好解決各平臺和語言間的數據通訊。
- 語意協議:使用基于XML的SOAP協議,定義業務數據格式。
- 傳輸協議:使用HTTP,TPC/IP,FTP,SMTP和JMS等,一般采用和支持較多的是HTTP。
- 接口描述語言:使用基于XML的WDSL作為統一服務描述。
SOAP
簡單對象訪問協議(SOAP:Simple Object Access Protocol)是一種輕量的、簡單的、基于 XML 的協議,它被設計成在 WEB 上交換結構化的和固化的信息。主要負責在WEBSERVICE服務中通訊報文數據格式的定義。 SOAP 可以和現存的許多因特網協議和格式結合使用,包括超文本傳輸協議( HTTP),簡單郵件傳輸協議(SMTP),多用途網際郵件擴充協議(MIME),傳統SOCKET通訊(TCP/IP),JAVA消息系統(JMS)等傳輸協議。它還支持從消息系統到遠程過程調用(RPC)等大量的應用程序。
SOAP 包括三個部分:
- SOAP 封裝:它定義了一個框架,該框架描述了消息中的內容是什么,誰應當處理它以及它是可選的還是必須的。
- SOAP 編碼規則:它定義了一種序列化的機制,用于交換應用程序所定義的數據類型的實例。
- SOAP RPC 表示:它定義了用于表示遠程過程調用和應答的協定。
SOAP 消息基本上是從發送端到接收端的單向傳輸,但它們常常結合起來執行類似于請求 / 應答的模式。所有的 SOAP 消息都使用 XML 編碼。一條 SOAP 消息就是一個包含有一個必需的 SOAP 的封裝包,一個可選的 SOAP 標頭和一個必需的 SOAP 體塊的 XML 文檔。
把 SOAP 綁定到 HTTP 提供了同時利用 SOAP 的樣式和分散的靈活性的特點以及 HTTP 的豐富的特征庫的優點。在 HTTP 上傳送 SOAP 并不是說 SOAP 會覆蓋現有的 HTTP 語義,而是 HTTP 上的 SOAP 語義會自然的映射到 HTTP 語義。在使用 HTTP 作為協議綁定的場合中, RPC 請求映射到 HTTP 請求上,而 RPC 應答映射到 HTTP 應答。簡單的說就是,通過HTTP POST(當然也可以GET或其它,一般是POST)方式傳輸一個SOAP協議定義的報文數據體,用于雙向通訊。然而,在 RPC 上使用 SOAP 并不僅限于 HTTP 協議綁定,也可以和其他的現行傳輸協議綁定。
語法規則
- SOAP 消息必須用 XML 來編碼
- SOAP 消息必須使用 SOAP Envelope 命名空間
- SOAP 消息必須使用 SOAP Encoding 命名空間
- SOAP 消息不能包含 DTD 引用
- SOAP 消息不能包含 XML 處理指令
SOAP報文結構
一條 SOAP 消息就是一個普通的 XML 文檔,包含下列元素:
- 必需的 Envelope標簽,文檔的ROOT,可把此 XML 文檔標識為一條 SOAP 消息
必需的 SOAP 的 Envelope 元素是 SOAP 消息的根元素。它可把 XML 文檔定義為 SOAP 消息 - 可選的 Header標簽,包含頭部信息
可選的 SOAP Header 元素可包含有關 SOAP 消息的應用程序專用信息(比如認證、支付等)。如果 Header 元素被提供,則它必須是 Envelope 元素的第一個子元素。 - 必需的 Body標簽,包含所有的調用和響應信息
必需的 SOAP Body 元素可包含打算傳送到消息最終端點的實際 SOAP 消息。
SOAP Body 元素的直接子元素可以是合格的命名空間。SOAP 在默認的命名空間中("http://www.w3.org/2001/12/soap-envelope")定義了 Body 元素內部的一個元素。即 SOAP 的 Fault 元素,用于指示錯誤消息。
- 可選的 Fault 元素,提供有關在處理此消息所發生錯誤的信息
來自 SOAP 消息的錯誤消息被攜帶于 Fault 元素內部。
如果已提供了 Fault 元素,則它必須是 Body 元素的子元素。在一條 SOAP 消息中,Fault 元素只能出現一次。
SOAP 的 Fault 元素用于下列子元素:
子元素 描述 <faultcode> 供識別故障的代碼 <faultstring> 可供人閱讀的有關故障的說明 <faultactor> 有關是誰引發故障的信息 <detail> 存留涉及 Body 元素的應用程序專用錯誤信息
<SOAP-ENV:Envelope?xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" //SOAP報文默認命名空間
?????????????????? xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" //編碼數據類型命名空間
?????????????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"//文檔XSD實例方案,規定格式
?????????????????? xmlns:xsd="http://www.w3.org/2001/XMLSchema">???????? //文檔XSD方案,規定格式
??? <!-- 信頭 -->
??? <SOAP-ENV:HEADER></SOAP-ENV:HEADER>
??? <!-- 信體 -->
??? <SOAP-ENV:Body>
????????<m:activateEpurse?xmlns:m="http://service.payment.ipayment.justinmobile.com">
????????????<m:appNo>String</m:appNo>
????????????<m:mobileNo>String</m:mobileNo>
????????</m:activateEpurse>
????</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP應答報文(返回一個entry數組,也就是MAP)
????<soap:Body>
????????<ns1:activateEpurseResponse?xmlns:ns1="http://service.payment.ipayment.justinmobile.com">
????????????<ns1:out>
????????????????<entry?xmlns="http://service.payment.ipayment.justinmobile.com">
????????????????????<key>transStatus</key>
????????????????????<value>0001</value>
????????????????</entry>
????????????</ns1:out>
????????</ns1:activateEpurseResponse>
????</soap:Body>
</soap:Envelope>
所有以上的元素均被聲明于針對 SOAP 封裝的默認命名空間中:
http://www.w3.org/2001/12/soap-envelope
SOAP 在默認的命名空間中 ("http://www.w3.org/2001/12/soap-envelope") 定義了三個屬性。這三個屬性是:actor、 mustUnderstand 以及 encodingStyle。這些被定義在 SOAP 頭部的屬性可定義容器如何對 SOAP 消息進行處理。
actor
通過沿著消息路徑經過不同的端點,SOAP 消息可從某個發送者傳播到某個接收者。并非 SOAP 消息的所有部分均打算傳送到 SOAP 消息的最終端點,不過,另一個方面,也許打算傳送給消息路徑上的一個或多個端點。
SOAP 的 actor 屬性可被用于將 Header 元素尋址到一個特定的端點。
soap:actor="URI"
mustUnderstand
SOAP 的 mustUnderstand 屬性可用于標識標題項對于要對其進行處理的接收者來說是強制的還是可選的。
假如您向 Header 元素的某個子元素添加了 "mustUnderstand="1",則它可指示處理此頭部的接收者必須認可此元素。假如此接收者無法認可此元素,則在處理此頭部時必須失效。
soap:mustUnderstand="0|1"
encodingStyle
SOAP 的 encodingStyle 屬性用于定義在文檔中使用的數據類型。此屬性可出現在任何 SOAP 元素中,并會被應用到元素的內容及元素的所有子元素上。SOAP 消息沒有默認的編碼方式。
soap:encodingStyle=" 以及針對 SOAP 編碼和數據類型的默認命名空間: http://www.w3.org/2001/12/soap-encoding