使用Gsoap编译wsdl文件
步骤1:
进入gsoap目录中,如:/bin/win64 或 /bin/win32目录中,这里例子中使用的是win64版本
步骤2:
获取.wsdl文件,网页搜索WebService发布地址,如:
http://localhost:5293/Controllers/WebService.asmx
届时将看到如下图信息
步骤3:
打开cmd,进入到wsdl2h.exe所在目录中
步骤4:
使用wsdl2h.exe生成WebService的头文件运行如下指令:
wsdl2h -o myWebService.h -t typemap.dat http://localhost:5293/Controllers/WebService.asmx
步骤5:
此时会在当前目录中看到生成后的myWebService.h头文件,我们需要用这个头文件来生成代码文件。
soapcpp2.exe 命令参数:
- -o 文件名,指定输出头文件
- -n 名空间前缀 代替默认的ns
- -c 产生纯C代码,否则是C++代码
- -s 不要使用STL代码
- -t 文件名,指定type map文件,默认为typemap.dat
- -e 禁止为enum成员加上名空间前缀
- -C 仅生成客户端代码
- -S 仅生成服务器端代码
- -L 不要产生soapClientLib.c和soapServerLib.c文件
- -I 指定import路径(此项是必要的,因前面为指定-s)
- -x 不要产生XML示例文件
- -i生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
这里在cmd命令框中运行如下代码:
soapcpp2.exe -L -I D:\gsoap_2.8.108\gsoap-2.8\gsoap\import myWebService.h
步骤6:
拷贝生成的文件至自己的工程中,一般包含8个文件,分别如下:
stdsoap2.h、stdsoap2.cpp、soapStub.h、soapH.h、soapC.cpp、
soapBasicHttpBinding_USCOREServiceContractProxy.h、
soapBasicHttpBinding_USCOREServiceContractProxy.cpp、
BasicHttpBinding_USCOREServiceContract.nsmap
其中,stdsoap2.h、stdsoap2.cpp这两个文件是gsoap包根目录中自带的,拷贝到自己工程目录中就行了,其他的文件都是生成的。
注意:
一般情况下,C++调用C++编写的webservice服务不会存在字符乱码问题,但在与C#、JAVA等其他语言编写的webservice服务时会出现字符串string乱码问题,这里的处理方式如下:
记事本打开生成的myWebService.h文件,并将所有std::string类型声明替换为wchar_t*类型,替换后重新运行soapcpp2.exe -L -I D:\gsoap_2.8.108\gsoap-2.8\gsoap\import myWebService.h
命令并将生成后的文件拷贝至C++客户端工程目录中。在调用webservice服务后,服务端返回的字符串类型数据使用如下代码处理一下就能够解决字符串乱码问题了。
char* ToMultiString(wchar_t* str)
{
int wide_len = static_cast<int>(wcslen(str) + 1);
int multi_len = WideCharToMultiByte(CP_ACP,0, str, wide_len, nullptr, 0, nullptr, nullptr);
// 分配多字节字符串的空间
char* multi_string = new char[multi_len];
// 转换宽字符串到多字节字符串
WideCharToMultiByte(CP_ACP, 0, str, wide_len, multi_string, multi_len, nullptr, nullptr);
return multi_string;
}