在windows下使用gSOAP技術(shù)調(diào)用WebService,使用vc開發(fā)
Posted on 2010-09-06 11:52 楊書童 閱讀(2191) 評(píng)論(0) 編輯 收藏 引用 所屬分類: 基礎(chǔ)知識(shí)-基礎(chǔ)語(yǔ)言1、環(huán)境搭建
操作系統(tǒng):Vista Home
gSOAP:2.7.17Stable版(下載地址:http://sourceforge.net/projects/gsoap2/)
c\c++集成環(huán)境:VC6.0
2、gSOAP
下載得到gsoap_2.7.17.zip文件,解壓該文件。稍后需要從該文件夾中獲取相關(guān)文件。設(shè)釋放路徑為"G:\webservice\gsoap-2.7",后文%GSOAP代表該文件夾路徑。
3、通過(guò)WSDL文檔,生成C/C++頭文件
3.1 WSDL是什么:WSDL (Web Services Description Language,Web服務(wù)描述語(yǔ)言)是一種XML Application,他將Web服務(wù)描述定義為一組服務(wù)訪問(wèn)點(diǎn),客戶端可以通過(guò)這些服務(wù)訪問(wèn)點(diǎn)對(duì)包含面向文檔信息或面向過(guò)程調(diào)用的服務(wù)進(jìn)行訪問(wèn)(類似遠(yuǎn)程過(guò)程調(diào)用)。WSDL首先對(duì)訪問(wèn)的操作和訪問(wèn)時(shí)使用的請(qǐng)求/響應(yīng)消息進(jìn)行抽象描述,然后將其綁定到具體的傳輸協(xié)議和消息格式上以最終定義具體部署的服務(wù)訪問(wèn)點(diǎn)。相關(guān)的具體部署的服務(wù)訪問(wèn)點(diǎn)通過(guò)組合就成為抽象的Web服務(wù)。
3.2 通過(guò)WSDL生成訪問(wèn)接口:(http://192.168.100.44:8888/kms_provincial/services/LoginInit?wsdl為一WebService接口)
設(shè)定c\c++工程名稱為TestWebService(Console程序,其他應(yīng)用程序類型也可),在該文件夾下面建立TestWebService.h文件。
啟動(dòng)cmd,進(jìn)入到%GSOAP/bin目錄,調(diào)用wsdl2h.exe程序生成TestWebService.h頭文件接口定義。
wsdl2h -s –o x:\xxx\TestWebService.h [url]http://192.168.100.44:8888/kms_provincial/services/LoginInit?wsdl[/url]
執(zhí)行完畢后,生成soapLoginInitSoapBindingProxy.h、soapLoginInitSoapBindingProxy.cpp文件。
3.3 解析TestWebService.h文件,生成存根程序
soapcpp2 –C x:\xxx\TestWebService.h
命令中參數(shù)-c代表生成標(biāo)準(zhǔn)C程序,若沒(méi)有這個(gè)參數(shù),則生成C++程序。
命令中參數(shù)-C代表僅生成客戶端程序,若沒(méi)有這個(gè)參數(shù),則默認(rèn)生成客戶端和服務(wù)端程序。4
4 建立vc工程
建立以TestWebService為名稱的console工程,將%GSOAP下的soapC.cpp、soapH.h、soapcpp2.h、stdsoap2.cpp、stdsoap2.h、soapStub.h、soapLoginInitSoapBindingProxy.cpp、soapLoginInitSoapBindingProxy.h加入到工程中。
//在TestWebService.cpp主工程中加入接口操作代碼。2

3
#include "soapH.h" // or whatever it is called, you must already have it4
#include "soapLoginInitSoapBindingProxy.h"5
#include "LoginInitSoapBinding.nsmap" // this is what you have to add to fix the problem6
int main(int argc, char* argv[])7


{8
printf("Hello World!\n");9
10
DWORD dwStartTime;11
DWORD dwEndTime;12
13
struct soap clientSOAP; 14
LoginInitSoapBindingProxy oLoginInitSoapInterface;15
char *pbRetuned = "";16
int iRet = 0;17
dwStartTime = GetTickCount();18
19
for (int i= 0; i<1000; i++)20

{21
soap_init(&clientSOAP); 22
23
iRet = oLoginInitSoapInterface.service(pbRetuned);24
25
#ifdef _DEBUG26
printf("result: oLoginInitSoapInterface.service = %d\r\n", iRet);27
printf("value = %s\r\n", pbRetuned);28
#endif29
30
soap_destroy(&clientSOAP); 31
soap_end(&clientSOAP); 32
soap_done(&clientSOAP);33
}34
35
dwEndTime = GetTickCount();36
printf("result: oLoginInitSoapInterface.service = %d\r\n", iRet);37
printf("value = %s\r\n", pbRetuned);38
printf("elaspe time = %d\r\n", (dwEndTime - dwStartTime)/i);39
40

41
return 0;42
}5、注意問(wèn)題
5.1 在工程頭文件中加入#include "LoginInitSoapBinding.nsmap" // this is what you have to add to fix the problem,否則會(huì)有編譯問(wèn)題,請(qǐng)自己嘗試;
5.2 中文漢字問(wèn)題,注意編碼問(wèn)題,統(tǒng)一即可。


