vc开发soap客户端(方式一)
?SoapSerializer
SoapSerializer對象用來構(gòu)建一個向Web服務(wù)發(fā)送的SOAP消息。在與服務(wù)器連接前,SoapSerializer對象必須與 SoapConnector對象連接。為了使這二個對象相互連接,我們需要調(diào)用SoapSerializer對象的Init方法,該方法需要一個參數(shù) InputStream(向服務(wù)器發(fā)送數(shù)據(jù)的流):
| // 創(chuàng)建一個SoapSerializer對象,并使用InputSTream對它進(jìn)行初始化 ISoapSerializERPtr Serializer; Serializer.CreateInstance(_uuidof(SoapSerializer)); Serializer->Init(_variant_t((IUnknown*)Connector->InputStream)); |
在討論SoapSerializer的其他函數(shù)以前,我們來看一個SOAP請求的例子:
| <SOAP: Envelope XMLns:SOAP="soap namespace"> <SOAP:Body> <m:someMethodName XMLns:m="some namespace"> <someParameter> someParameterValue </someParameter> <m:someMethodName> </SOAP:Body> </SOAP: Envelope> |
SOAP請求被封裝在了標(biāo)記中。<Envelope>標(biāo)記是該SOAP文檔的主標(biāo)記,SOAP消息通常都被封裝在<Envelope>元素中, <Envelope>元素包含一個由<Body>標(biāo)記指定的消息體,該消息體包含著實際的請求。在C++中,有非常合適的方法可以創(chuàng)建這些標(biāo)記并指定其 值。下面的代碼說明了如何利用這些方法:
| Serializer->startEnvelope("SOAP","",""); // 如果它是空值,就會缺省地使用SOAP-ENV。第二、第三個參數(shù) // 分別描述了URI和編碼類型。 // 消息中<Body>元素的開始,第一個參數(shù)描述了編碼風(fēng)格Uri,其缺省的值為NONE。 // SOAP消息中<Body>元素的子元素的開始。第一個參數(shù)是子元素名字 //第二個參數(shù)是URI,第三個參數(shù)是編碼類型,最后一個參數(shù)是元素的名字空間。 // 寫元素的值 |
上面以startXXX開頭的函數(shù)都相應(yīng)地有以endXXX開頭、結(jié)束元素的函數(shù)。在完成消息后,系統(tǒng)會調(diào)用連接的endMessage()方法,真正開始向服務(wù)發(fā)送消息。
現(xiàn)在我們已經(jīng)與服務(wù)相連接,準(zhǔn)備好了我們的請求,并將它發(fā)送給了服務(wù)。最后一個步驟就是讀取來自服務(wù)器的響應(yīng)。下面我們就來討論這一問題。
SoapReader
該對象讀取來自Web服務(wù)的響應(yīng),并將它解析為DOM,以備進(jìn)一步處理之用。下面是一個來自Web服務(wù)的響應(yīng)的例子:
| <SOAP: Envelope xmlns:SOAP="soap namespace"> <SOAP:Body> <m:someMethodNameResponse xmlns:m="some namespace"> <return> someResult </return> <m:someMethodNameResponse> </SOAP:Body> </SOAP: Envelope> |
在調(diào)用任何方法獲取結(jié)果前,我們聯(lián)接OutputStream,讀取存儲在SoapReader對象中的響應(yīng)(OutputStream用于接收來自Web服務(wù)的數(shù)據(jù)):
| // 創(chuàng)建SOAPReader對象和與outputstream聯(lián)接的代碼 ISoapReaderPtr Reader; Reader.CreateInstance(_uuidof(SoapReader)); Reader->Load(_variant_t((IUnknown*)Connector->OutputStream)); // load方法也能夠接收XML文檔文件或字符串 |
在將Web服務(wù)的響應(yīng)加載到SoapReader對象后,我們可以通過調(diào)用SoapReader對象的RPCResult屬性獲得相應(yīng)的結(jié)果, 但RPCResult并不返回真正的結(jié)果,它返回的是<Body>元素中第一個條目的第一個子元素。我們可以通過調(diào)用text屬性返回真正的結(jié)果:
| Reader->RPCResult->text |
一個SOAP客戶端應(yīng)用程序的例子
為了說明如 何使用本篇文章中討論的SOAP類,我們使用了http://www.xmethods.net/上列出的一項服務(wù),該服務(wù)能夠顯示用戶是否正在使用 Yahoo Messenger。它只需要一個參數(shù),即Yahoo用戶的登錄ID。返回的結(jié)果是一個布爾型值,0表示用戶不在線,1表示用戶在線。
我一直認(rèn)為,學(xué)習(xí)某種編程技術(shù)的最好的方法就是實地學(xué)習(xí)源代碼,在這里,我們就采取這種方法。下面是使用SOAP調(diào)用發(fā)現(xiàn)Yahoo用戶是否在線的一個控制臺應(yīng)用程序的C++代碼:
| #include #import "msxml3.dll" #import "C:\Program Files\Common Files\MSSoap\Binaries\MSSOAP1.dll" \ using namespace MSSOAPLib; void main() ISoapSerializerPtr Serializer; // 與Web服務(wù)連接 // 開始消息 // 創(chuàng)建SoapSerializer對象 // 將serializer連接到connector的輸入字符串 // 創(chuàng)建SOAP消息 // 將該消息發(fā)送給web服務(wù) // 讀取響應(yīng) // 將reader聯(lián)接到connector的輸出字符串 // 顯示結(jié)果 } |
我們可以看到,代碼十分簡單,即使沒有使用過C++,我保證讀者也能夠理解上面代碼的作用:首先,它與遠(yuǎn)程服務(wù)器連接;其次,它創(chuàng)建SOAP消息并向web服務(wù)發(fā)送該消息;最后,讀取服務(wù)器的響應(yīng),并使用printf將它輸出到屏幕上。
結(jié)論
在本篇文章中,我們討論了如何使用Visual C++建立一個簡單的SOAP客戶端應(yīng)用程序。我們還學(xué)習(xí)了SOAP Toolkit中的幾個方法以及如何使用SOAP從服務(wù)器獲取數(shù)據(jù)。希望通過本篇文章,使讀者能夠掌握如何使用C++開發(fā)SOAP客戶端應(yīng)用程序。?
最后:大家最關(guān)心如何注冊soap里的dll,SOAP只需要如下文件: MSSOAP30.DLL MSSOAPR3.DLL WISC30.dll MSXML4只需要如下文件: msxml4r.dll msxml4.dll 注意:文件注冊順序也如上所列順序。保證能用。你自己寫個批處理在打包的時候一起打包就OK了
?
其他方式: http://blog.csdn.net/Tr0j4n/archive/2009/12/25/5077787.aspx
總結(jié)
以上是生活随笔為你收集整理的vc开发soap客户端(方式一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SharePoint Workflow
- 下一篇: 复数矩阵QR分解算法的C++实现