SOAP協(xié)議的定義、傳輸和消息
在網(wǎng)絡(luò)應(yīng)用服務(wù)中,我們規(guī)定SOAP協(xié)議為一種標(biāo)準(zhǔn)化的通訊規(guī)范。那么這個(gè)SOAP協(xié)議的意思則是:簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SOAP,全寫(xiě)為Simple Object Access Protocol),它主要用于Web服務(wù)(web service)中。SOAP的出現(xiàn)是為了簡(jiǎn)化網(wǎng)頁(yè)服務(wù)器(Web Server)在從XML數(shù)據(jù)庫(kù)中提取資料時(shí),無(wú)需花時(shí)間去格式化頁(yè)面,并能夠讓不同應(yīng)用程式之間透過(guò)HTTP通訊協(xié)定,以XML格式互相交換彼此的資料,使其與程式語(yǔ)言、平臺(tái)和硬體無(wú)關(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è)簡(jiǎn)單的例子來(lái)說(shuō)明SOAP使用過(guò)程,一個(gè)SOAP消息可以發(fā)送到一個(gè)具有 Web Service 功能的 Web 站點(diǎn),例如,一個(gè)含有房?jī)r(jià)信息的數(shù)據(jù)庫(kù),消息的參數(shù)中標(biāo)明這是一個(gè)查詢消息,此站點(diǎn)將返回一個(gè) XML 格式的信息,其中包含了查詢結(jié)果(價(jià)格,位置,特點(diǎn),或者其他信息)。由于數(shù)據(jù)是用一種標(biāo)準(zhǔn)化的可分析的結(jié)構(gòu)來(lái)傳遞的,所以可以直接被第三方站點(diǎn)所利用。
相關(guān)定義
SOAP封裝(envelop),它定義了一個(gè)框架,描述消息中的內(nèi)容是什么,是誰(shuí)發(fā)送的,誰(shuí)應(yīng)當(dāng)接受并處理它以及如何處理它們;
SOAP編碼規(guī)則(encoding rules),它定義了一種序列化的機(jī)制,用于表示應(yīng)用程序需要使用的數(shù)據(jù)類型的實(shí)例;
SOAPRPC表示(RPC representation),它定義了一個(gè)協(xié)定,用于表示遠(yuǎn)程過(guò)程調(diào)用和應(yīng)答;
SOAP綁定(binding),它定義了SOAP協(xié)議使用哪種協(xié)議交換信息。使用HTTP/TCP/UDP協(xié)議都可以。
把SOAP綁定到 HTTP 提供了同時(shí)利用SOAP的樣式和分散的靈活性的特點(diǎn)以及 HTTP 的豐富的特征庫(kù)的優(yōu)點(diǎn)。在 HTTP 上傳送SOAP并不是說(shuō)SOAP會(huì)覆蓋現(xiàn)有的 HTTP 語(yǔ)義,而是HTTP 上的SOAP語(yǔ)義會(huì)自然的映射到 HTTP 語(yǔ)義。在使用 HTTP 作為協(xié)議綁定的場(chǎng)合中, RPC 請(qǐng)求映射到 HTTP 請(qǐng)求上,而 RPC 應(yīng)答映射到 HTTP 應(yīng)答。然而,在 RPC 上使用SOAP并不僅限于 HTTP 協(xié)議綁定。
歷史
SOAP曾經(jīng)代表“Simple Object Access Protocol”,但是這種縮寫(xiě)已經(jīng)在標(biāo)準(zhǔn)的1.2版后被廢止了。1.2版在2003年6月24日成為W3C的推薦版本。這種縮寫(xiě)容易與SOA——Service-oriented architecture產(chǎn)生歧義,雖然它們之間存在非常大的差異。
SOAP是在1998年由Dave Winer, Don Box,Bob Atkinson 和 Mohsen Al-Ghosein 設(shè)計(jì)的。當(dāng)時(shí)是將其作為一種對(duì)象訪問(wèn)協(xié)議?,F(xiàn)在,SOAP規(guī)范是由萬(wàn)維網(wǎng)聯(lián)盟的XML工作組進(jìn)行維護(hù)的。
傳輸方式
SOAP使用因特網(wǎng)應(yīng)用層協(xié)議作為其傳輸協(xié)議。SMTP以及HTTP協(xié)議都可以用來(lái)傳輸SOAP消息,但是由于HTTP在如今的因特網(wǎng)結(jié)構(gòu)中工作得很好,特別是在網(wǎng)絡(luò)防火墻下仍然工作流暢,所以其更為廣泛地被采納。SOAP亦可以在HTTPS上進(jìn)行傳輸。
SOAP的消息格式采用XML。
SOAP協(xié)議的消息實(shí)例
請(qǐng)求
- <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>