GSOAP-WebService调用

使用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 命令参数:

  1. -o 文件名,指定输出头文件
  2. -n 名空间前缀 代替默认的ns
  3. -c 产生纯C代码,否则是C++代码
  4. -s 不要使用STL代码
  5. -t 文件名,指定type map文件,默认为typemap.dat
  6. -e 禁止为enum成员加上名空间前缀
  7. -C 仅生成客户端代码
  8. -S 仅生成服务器端代码
  9. -L 不要产生soapClientLib.c和soapServerLib.c文件
  10. -I 指定import路径(此项是必要的,因前面为指定-s)
  11. -x 不要产生XML示例文件
  12. -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;
}

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值