SOAP協(xié)議的定義、傳輸和消息
在網(wǎng)絡(luò)應(yīng)用服務(wù)中,我們規(guī)定SOAP協(xié)議為一種標(biāo)準(zhǔn)化的通訊規(guī)范。那么這個(gè)SOAP協(xié)議的意思則是:簡單對象訪問協(xié)議(SOAP,全寫為Simple Object Access Protocol),它主要用于Web服務(wù)(web service)中。SOAP的出現(xiàn)是為了簡化網(wǎng)頁服務(wù)器(Web Server)在從XML數(shù)據(jù)庫中提取資料時(shí),無需花時(shí)間去格式化頁面,并能夠讓不同應(yīng)用程式之間透過HTTP通訊協(xié)定,以XML格式互相交換彼此的資料,使其與程式語言、平臺和硬體無關(guān)。此標(biāo)準(zhǔn)由IBM、Microsoft、UserLand和DevelopMentor在1998年共同提出,并得到IBM,蓮花(Lotus),康柏(Compaq)等公司的支持,于2000年提交給全球資訊網(wǎng)聯(lián)盟(World Wide Web Consortium;W3C),目前SOAP1.1 版是業(yè)界共同的標(biāo)準(zhǔn),屬于第二代的XML協(xié)定(第一代具主要代表性的技術(shù)為XML-RPC以及WDDX)。
用一個(gè)簡單的例子來說明SOAP使用過程,一個(gè)SOAP消息可以發(fā)送到一個(gè)具有 Web Service 功能的 Web 站點(diǎn),例如,一個(gè)含有房價(jià)信息的數(shù)據(jù)庫,消息的參數(shù)中標(biāo)明這是一個(gè)查詢消息,此站點(diǎn)將返回一個(gè) XML 格式的信息,其中包含了查詢結(jié)果(價(jià)格,位置,特點(diǎn),或者其他信息)。由于數(shù)據(jù)是用一種標(biāo)準(zhǔn)化的可分析的結(jié)構(gòu)來傳遞的,所以可以直接被第三方站點(diǎn)所利用。
相關(guān)定義
SOAP封裝(envelop),它定義了一個(gè)框架,描述消息中的內(nèi)容是什么,是誰發(fā)送的,誰應(yīng)當(dāng)接受并處理它以及如何處理它們;
SOAP編碼規(guī)則(encoding rules),它定義了一種序列化的機(jī)制,用于表示應(yīng)用程序需要使用的數(shù)據(jù)類型的實(shí)例;
SOAPRPC表示(RPC representation),它定義了一個(gè)協(xié)定,用于表示遠(yuǎn)程過程調(diào)用和應(yīng)答;
SOAP綁定(binding),它定義了SOAP協(xié)議使用哪種協(xié)議交換信息。使用HTTP/TCP/UDP協(xié)議都可以。
把SOAP綁定到 HTTP 提供了同時(shí)利用SOAP的樣式和分散的靈活性的特點(diǎn)以及 HTTP 的豐富的特征庫的優(yōu)點(diǎn)。在 HTTP 上傳送SOAP并不是說SOAP會覆蓋現(xiàn)有的 HTTP 語義,而是HTTP 上的SOAP語義會自然的映射到 HTTP 語義。在使用 HTTP 作為協(xié)議綁定的場合中, RPC 請求映射到 HTTP 請求上,而 RPC 應(yīng)答映射到 HTTP 應(yīng)答。然而,在 RPC 上使用SOAP并不僅限于 HTTP 協(xié)議綁定。
歷史
SOAP曾經(jīng)代表“Simple Object Access Protocol”,但是這種縮寫已經(jīng)在標(biāo)準(zhǔn)的1.2版后被廢止了。1.2版在2003年6月24日成為W3C的推薦版本。這種縮寫容易與SOA——Service-oriented architecture產(chǎn)生歧義,雖然它們之間存在非常大的差異。
SOAP是在1998年由Dave Winer, Don Box,Bob Atkinson 和 Mohsen Al-Ghosein 設(shè)計(jì)的。當(dāng)時(shí)是將其作為一種對象訪問協(xié)議。現(xiàn)在,SOAP規(guī)范是由萬維網(wǎng)聯(lián)盟的XML工作組進(jìn)行維護(hù)的。
傳輸方式
SOAP使用因特網(wǎng)應(yīng)用層協(xié)議作為其傳輸協(xié)議。SMTP以及HTTP協(xié)議都可以用來傳輸SOAP消息,但是由于HTTP在如今的因特網(wǎng)結(jié)構(gòu)中工作得很好,特別是在網(wǎng)絡(luò)防火墻下仍然工作流暢,所以其更為廣泛地被采納。SOAP亦可以在HTTPS上進(jìn)行傳輸。
SOAP的消息格式采用XML。
SOAP協(xié)議的消息實(shí)例
請求
- <soapenv:Envelope
- xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
- <req:echo xmlns:req="http://localhost:8080/axis2/services/MyService/">
- <req:category>classifieds</req:category>
- </req:echo>
- </soapenv:Body>
- </soapenv:Envelope>
回應(yīng)
- <soapenv:Envelope
- xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
- <soapenv:Header>
- <wsa:ReplyTo>
- <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
- </wsa:ReplyTo>
- <wsa:From>
- <wsa:Address>http://localhost:8080/axis2/services/MyService</wsa:Address>
- </wsa:From>
- <wsa:MessageID>ECE5B3F187F29D28BC11433905662036</wsa:MessageID>
- </soapenv:Header>
- <soapenv:Body>
- <req:echo xmlns:req="http://localhost:8080/axis2/services/MyService/">
- <req:category>classifieds</req:category>
- </req:echo>
- </soapenv:Body>
- </soapenv:Envelope>