1.下载gsoap2.8

2.运行

wsdl2h.exe -o XXX.h XXX.wsdl

wsdl文件可以是本地文件,也可以是服务器的wsdl,比如http://192.168.0.122:3333/ws/uss?wsdl

3.生成客户端代码

soapcpp2.exe  -L -x -C XXX.h -I .\gsoap-2.8\gsoap\import

4.如果有多个服务,那么就将要使用命名空间

wsdl2h -nns别名 -N服务命名空间 -o XXX.h XXX.wsdl
wsdl2h -nuseraddns -NUserAddWS -oUserAddWebService.h userAddWebService.wsdl
wsdl2h -nuserloginns -NUserLoginWS -oUserLoginWebService.h userLoginWebService.wsdl

手动将生成的.h合并为一个新文件,比如上面两个User*.h,合并为新文件all.h,对照着很容易看出不同,把命名空间,类声明等合在一起就行了

soap2cpp -LCx -pCMSWS All.h -I ../../import

拷贝gsoap2.8目录下的stdsoap2.h,stdsoap2.cpp到程序目录,并修改stdsoap2.cpp文件,将其中一个.nsmap文件包含进去

#include "xxx.nsmap"

5.传输中文

调用方法转为utf-8传输soap_set_mode( soap*, SOAP_C_UTFSTRING )

如果用qt的QString将转换

std::string CUIUtils::convertQStrToUTF8Str(const QString& value) {
QByteArray arr = value.toUtf8();
return std::string(arr.data());
} QString CUIUtils::convertUTF8StrToQStr(const std::string& value) {
return QString::fromUtf8(value.c_str());
}

例子

int CUserDetailInfoWebServiceImpl::getUserInfo(const char* address, CUserDetailInfo* userDetailInfo)
{
UserDetailInfoWebServiceCXFImplServiceSoapBinding webServiceBinding;
if ((NULL != address) && strlen(address) > )
{
webServiceBinding.endpoint = address;
}
soap_set_mode(webServiceBinding.soap, SOAP_C_UTFSTRING);
userDetailInfo->setRetCode(RET_CODE_ERROR_UNKNOWN);
UserDetailInfoWS__getUserInfoByUserId request;
std::string id = userDetailInfo->getUserId();
request.userId = &id;
UserDetailInfoWS__getUserInfoByUserIdResponse response;
int ret = webServiceBinding.__UserDetailInfoWS__getUserInfoByUserId(&request, &response);
if (SOAP_OK == ret)
{
if (NULL == response.result)
{
userDetailInfo->setRetCode(RET_CODE_NULL_OBJECT);
userDetailInfo->setErrorDesc("no return value");
return userDetailInfo->getRetCode();
}
userDetailInfo->setRetCode(response.result->retCode);
if (RET_CODE_SUCCESS != userDetailInfo->getRetCode())
{
userDetailInfo->setErrorDesc(*response.result->desc);
}
else
{
if (NULL == response.result->userOperateInfo)
{
userDetailInfo->setRetCode(RET_CODE_NULL_OBJECT);
userDetailInfo->setErrorDesc("no return info");
return userDetailInfo->getRetCode();
}
userDetailInfo->setDescript(*response.result->userOperateInfo->descript);
userDetailInfo->setDepartmentId(*response.result->userOperateInfo->departmentId);
userDetailInfo->setEnabled(response.result->userOperateInfo->enable);
userDetailInfo->setLoginName(*response.result->userOperateInfo->loginName);
userDetailInfo->setPassword(*response.result->userOperateInfo->password);
userDetailInfo->setUserName(*response.result->userOperateInfo->name);
} }
else
{
userDetailInfo->setRetCode(RET_CODE_SOAP_ERROR);
userDetailInfo->setDescript(*soap_faultstring(webServiceBinding.soap));
}
return userDetailInfo->getRetCode(); }

6.导入多个wsdl文件

wsdl2h.exe -sck -t e:\test\typemap.dat -o onvif.h analytics.wsdl analyticsdevice.wsdl deviceio.wsdl devicemgmt.wsdl display.wsdl event.wsdl imaging.wsdl media.wsdl ptz.wsdl Receiver.wsdl Recording.wsdl remotediscovery.wsdl Replay.wsdl Search.wsdl

7.操作参数:

以下就是wsdl2h的选项:

-o 文件名,指定输出头文件
-n 名空间前缀 代替默认的ns
-c 产生纯C代码,否则是C++代码
-s 不要使用STL代码
-t 文件名,指定type map文件,默认为typemap.dat
-e 禁止为enum成员加上名空间前缀
type map文件用于指定SOAP/XML中的类型与C/C++之间的转换规则,比如在wsmap.dat里写
xsd__string = | std::wstring | wchar_t*
那么SOAP/XML中的string将转换成std::wstring或wchar_t*,这样能更好地支持中文。
接着就是讲.h文件生成.cpp文件
soapcpp2.exe接的选项如下
-C 仅生成客户端代码
-S 仅生成服务器端代码
-L 不要产生soapClientLib.c和soapServerLib.c文件
-c 产生纯C代码,否则是C++代码(与头文件有关)
-I 指定imp<wbr>ort路径(见上文) </wbr>
-x 不要产生XML示例文件
-i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
这里一般需要带上-x,不然会生成一大堆的xml文件。
-i选项也要带上,不然不会生成soapXXXXBindingService.cpp和soapXXXXBindingService.h文件
-I 选项一般也要带上,-I 后接gsoap路径中import目录
一般是-I E:\workspace\onvif\gsoap-2.8\gsoap\import;E:\workspace\onvif\gsoap-2.8\gsoap这样的

转自:https://blog.csdn.net/johnnywww/article/details/8187398

gsoap生成webservice调用客户端接口的更多相关文章

  1. 动态生成WebService的客户端

    给定了WebService地址和调用接口后动态的生成DLL,第二次再请求时会先判断DLL是否存在,以提高执行效率 核心代码下: /// <summary> /// 动态生成WebServi ...

  2. 利用wsdl2java工具生成webservice的客户端代码

    1.JDK环境  2.下载apache-cxf发布包:http://cxf.apache.org/download.html 目前最新版本为3.2.6, 解压后如下: 解压发布包,设置CXF_HOME ...

  3. 二、openfeign生成并调用客户端动态代理对象

    所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 上一篇文章中,我们了解到了@FeignClient注解的接口被扫描到以后,会生成一个Fe ...

  4. 使用axis1.4生成webservice的客户端代码

    webservice服务端: https://blog.csdn.net/ghsau/article/details/12714965 跟据WSDL文件地址生成客服端代码: 1.下载 axis1.4 ...

  5. 根据wsdl文件生成WebService客户端代码

    有时候在项目中,一个项目可能有好几个公司在做.系统之间难免会出现互相调用接口的现象,这时候有一种办法就是使用webService.本篇文章将介绍如何将对接系统提供的WebService接口,根据对方提 ...

  6. onvif规范的实现:使用gSOAP创建SOAP调用实例

    预备知识 ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供.ONVIF规范涵盖了完全的XML及WSDL的定义.每一个支持ONVIF规范的终端设备均须提供与功能相应的 ...

  7. 根据wsdl反向生成webservice服务端(3种方法)

    前言 正常情况下,都是我们项目组创建一个webservice服务端,客户通过我们提供的wsdl地址生成客户端并进行访问:但是最近和一个国企做接口对接,他们却只提供给我们wsdl,需要我们根据wsdl生 ...

  8. [置顶] Java WebService接口生成和调用 图文详解

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  9. Java WebService接口生成和调用 图文详解>【转】【待调整】

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

随机推荐

  1. 「SAP 技术」SAP BP显示供应商账户组时候的怪现象

    SAP BP显示供应商账户组时候的怪现象 BP事务代码显示某个vendor的时候,笔者发现对于账户组字段选项列表里,不显示当前vendor的account group. 如下图,该供应商的accoun ...

  2. 区块链社交APP协议分析:Qbao

    - Qbao是什么 - Qbao报文情况 本节我们开始使用Qbao软件,并抓取其报文进行分析. 对APP进行协议分析抓包的一般过程是: 1.打开抓包APP进行抓包: 2.打开APP开始使用: 3.对每 ...

  3. matlab C程序

    通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度 Matlab本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Watcom C中的一种 注:在Matlab里,矩阵 ...

  4. LeetCode——Delete Duplicate Emails(巧用mysql临时表)

    Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique ...

  5. 比hive快10倍的大数据查询利器presto部署

    目前最流行的大数据查询引擎非hive莫属,它是基于MR的类SQL查询工具,会把输入的查询SQL解释为MapReduce,能极大的降低使用大数据查询的门槛, 让一般的业务人员也可以直接对大数据进行查询. ...

  6. Python—时间模块(time)和随机模块(random)

    时间模块 time模块 获取秒级时间戳.毫秒级时间戳.微秒级时间戳 import time t = time.time() print t # 原始时间数据 1574502460.90 print i ...

  7. 渗透测试学习 二十八、WAF绕过详解

    大纲: WAF防护原理讲解 目录扫描绕过WAF 手工注入绕过WAF sqlmap绕过WAF 编写salmap绕过WAF 过WAF一句话编写讲解 菜刀连接绕过WAF webshell上传绕过WAF 提权 ...

  8. 通过GL函数处理图片以及其它相关功能

    我们知道在屏幕后处理里面通过 Graphics.Blit 函数可以通过材质处理屏幕图片, 当我们想要处理一般图片的时候, 直接调用GL函数就行了, 按照习惯自己封装一个 Blit 方法 : ) { i ...

  9. 关于一个.2lf和.2f的战争!(貌似书上错了,静待打脸。)

    在山东理工oj上做题,谈到了输入数据... double i: scanf(“%lf”,&i): 谨记呀,lf时,可以输入任何类型的数据,而.2f,只能输入符合其规格的数据. 再谈输出,dou ...

  10. 支付宝AopSdk在dotnet core下的实现

    随着项目都迁移到了dotnet core下,阿里的支付宝也需要随着项目迁移.之前在.Net Framework下用到了阿里提供的AopSdk和F2FPay两个程序集,支付宝官方提供的只支持Framew ...