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. MYSQL 复制整个数据库

    同一个服务器 mysqldump old -u root -p123456  | mysql new -u root -p123456 不同服务器(在源数据库服务器上执行) mysqldump old ...

  2. 「SAP技术」 SAP MM MPN物料的采购初探

    「SAP技术」 SAP MM MPN物料的采购初探 1, MPN物料号与我方正常使用料号物料主数据之间的LINK关系维护 MPN料号 14000005 , 我方料号11000250 , 2,采购信息记 ...

  3. 利用InsertStatusValueRequest消息为新增的statuscode设定指定值(Value)

    我是微软Dynamcis 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  4. Git的使用(2)

    一.git在不同平台下的安装 (1)在linux上安装 如果以centos为例,可以使用yum安装,如下命令: sudo yum install git 如果你在基于debian的发行版上,尝试使用: ...

  5. MySQL 同一Windows系统上安装多个数据库

    Step 1:拷贝一份MySQL整个安装文件,并拷贝一份 my.ini 文件放置安装目录下,然后修改以下内容.注意 port 不能设置为默认的3306,这里我们设置为3307端口. basedir=C ...

  6. [日常] gocron源码阅读-go语言的变量

    变量的声明形式是这样的 var 变量名字 类型 = 表达式var ( AppVersion = "1.5" BuildDate, GitCommit string)类型可以被省略, ...

  7. Linux下迅速删除一个大文件夹

    rsync -av --delete /tmp/null/ ./        迅速删除大文件夹,如缓存 快速删除大目录(即大量文件)1.先建立一个空目录 mkdir /data/blank 2.用r ...

  8. C++ 学习六 operator关键字(重载)

    转载:http://blog.sina.com.cn/s/blog_4b3c1f950100kker.html operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将 o ...

  9. Html学习之十八(表格与表单学习--统计表制作)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 201271050130-滕江南《面向对象程序设计(java)》第十周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...