因為工作關系,需要在C++中調用C#所寫的webservice,在博客園中搜索可以發現很多關於gSoap的學習筆記,但自己還是想再寫一篇。特定於自己的版本和使用環境。
客戶端在windows環境下,使用gSoap2.8.11和VS2008。webservice的服務器用c#實現。
服務器端的實現省略不談~~先用瀏覽器打開webservice的網頁
點擊“服務說明”,可以查看到這個ws的"wsdl"文件,將其復制保存到文本文件中(下面會使用到)。
下載gSoap2.8.11版后,解壓,在命令行中進入 gsoap-2.8/gsoap/bin/win32/ ,會發現有兩個文件"soapcpp2.exe","wsdl2h.exe",將上面保存的wsdl文本文件復制到此,並命名為"ws.wsdl"。
- 用WSDL文件生成c++頭文件,wsdl2h.exe -s -o ws.h ws.wsdl ,執行完后會生成ws.h文件
- 用ws.h文件生成項目所需文件,
,執行完后會生成如圖所示的文件
這里的文件會隨着webservice中定義函數的增多而增多。 - 復制 將上面除了soapClientLib.cpp文件以外,都復制、並添加到項目中。再將gsoap-2.8/gsoap文件夾下的stdsoap2.h,stdsoap2.cpp復制、並添加到項目中
- 修改 在項目中修改三個地方:sopaClient.cpp,soapC.cpp的第一行中添加#include "stdafx.h",在stdafx.cpp中添加#include "webService1Soap.nsmap"
- 運用 在項目中需要調用webservice的地方引用后綴為 soapProxy.h,在上面的例子中是soapWebService1SoapProxy.h。
WebService1Soap service; int v; service.ns1__Add(23,34,v); cout<<v<<"\n";
在webservice中定義的函數都會加上ns1__前綴,最后一個參數為返回值,采用引用傳值方式返回想要的值。如果函數沒有返回值,則要定義一個ns1__NoReturnResponse變量作為占位符。
如果函數返回是的字符串,則直接將char *ch類型的對象接收,並且不需要自己去管理內存。在本機上測試,用gsoap可以傳輸4M圖片的base64編碼。
PS:調通gsoap自己只用了一兩個小時的時間,這充分說明了gSoap的強大,關鍵她是開源的,之前從來沒有寫過C++的網絡程序,現在可以通過這個庫開始C++網絡編程了,有時間一定要將這個庫的源碼解剖一番。與gSoap相比,微軟的MSSoap就只能被人冷落了~~
參考:http://www.cnblogs.com/lvkun/archive/2010/03/30/gsoap_note.html