gsoap生成webservice调用客户端接口
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调用客户端接口的更多相关文章
- 动态生成WebService的客户端
给定了WebService地址和调用接口后动态的生成DLL,第二次再请求时会先判断DLL是否存在,以提高执行效率 核心代码下: /// <summary> /// 动态生成WebServi ...
- 利用wsdl2java工具生成webservice的客户端代码
1.JDK环境 2.下载apache-cxf发布包:http://cxf.apache.org/download.html 目前最新版本为3.2.6, 解压后如下: 解压发布包,设置CXF_HOME ...
- 二、openfeign生成并调用客户端动态代理对象
所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 上一篇文章中,我们了解到了@FeignClient注解的接口被扫描到以后,会生成一个Fe ...
- 使用axis1.4生成webservice的客户端代码
webservice服务端: https://blog.csdn.net/ghsau/article/details/12714965 跟据WSDL文件地址生成客服端代码: 1.下载 axis1.4 ...
- 根据wsdl文件生成WebService客户端代码
有时候在项目中,一个项目可能有好几个公司在做.系统之间难免会出现互相调用接口的现象,这时候有一种办法就是使用webService.本篇文章将介绍如何将对接系统提供的WebService接口,根据对方提 ...
- onvif规范的实现:使用gSOAP创建SOAP调用实例
预备知识 ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供.ONVIF规范涵盖了完全的XML及WSDL的定义.每一个支持ONVIF规范的终端设备均须提供与功能相应的 ...
- 根据wsdl反向生成webservice服务端(3种方法)
前言 正常情况下,都是我们项目组创建一个webservice服务端,客户通过我们提供的wsdl地址生成客户端并进行访问:但是最近和一个国企做接口对接,他们却只提供给我们wsdl,需要我们根据wsdl生 ...
- [置顶]
Java WebService接口生成和调用 图文详解
webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...
- Java WebService接口生成和调用 图文详解>【转】【待调整】
webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...
随机推荐
- django支付宝支付集成
概要 本文是关于django集成支付宝[电脑网站支付]功能的过程记录. 功能逻辑主要分为两块: 用户下单跳转至支付宝支付界面 支付成功的回调验证 本文用到的alipay-sdk是基于阿里开发文档htt ...
- 1_Swift概况
Swift 标准库 解决复杂的问题并编写高性能,可读的代码 概况 Swift标准库定义了用于编写Swift程序的基本功能,其中包括 1.如基本数据类型Int,Double以及String 2.共同的数 ...
- 2018年最新Java面试题及答案整理
基础篇 基本功 面向对象特征 封装,继承,多态和抽象 封装封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在 Java 当中,有 3 种修饰符: pub ...
- 浅谈[].slice.call(arguments, 1)
今天在跟踪调试项目的代码时,发现在一个function中用到了这么一段[].slice.call(arguments, 1) 的代码.心中便起了疑惑,对于slice 和 call 的方法,倒是不怎么陌 ...
- centos7下安装配置prometheus
prometheus官网:https://prometheus.io/download/ 搭建环境参考:https://blog.csdn.net/baidu_36943075/article/det ...
- 2、zabbix3.4的安装
系统版本:centos7 数据库版本:mysql二进制安装5.7 zabbix:阿里云安装3.4 一.Zabbix的安装 Zabbix3.4版本官方安装手册链接:https://www.zabbix. ...
- jQuery中的工具(十)
1. jQuery.each(object, [callback]), 通用遍历方法,可用于遍历对象和数组 不同于遍历 jQuery 对象的 $().each() 方法,此方法可用于遍历任何对象.回调 ...
- CME Futures & Options Order Book
http://algo-logic.com/futures-options-orderbook Algo-Logic Systems’ Futures & Options (F&O) ...
- luoguP3242 [HNOI2015]接水果
题意 考虑整体二分. 考虑路径\((x,y)\)被路径\((u,v)\)包含需要满足什么条件: 设\(dfn_x\)表示\(x\)的\(dfs\)序,\(low_x=dfn_x+size_x-1\), ...
- Python进阶-XVI 继承 单继承 多继承
一.初识继承 1.引入继承 class A(object): pass # 父类,基类,超类 class B: pass # 父类,基类,超类 class A_son(A, B): pass # 子类 ...