gSOAP 初体验
安装
由于本人使用的是 Mac OS 系统,故以 Mac OS 为例说明如何安装 gSOAP。
1)下载 gSOAP
可以在 https://sourceforge.net/projects/gsoap2 下载最新版本的 gSOAP。
2)安装 flex, bison, openssl
可以使用brew install进行安装:
brew install flex bison openssl
3)编译安装 gSOAP
解压上面下载的 gSOAP,然后执行下面的命令:
cd gsoap-2.8
./configure --with-openssl=/usr/local/opt/openssl
make
sudo make install
安装完成,会出现以下的提示: 
安装中如果出现 fatal error: 'openssl/bio.h' file not found 的错误,可以通过尝试重新安装 openssl 和使用最新的 gsoap-2.8 版本的方法来解决,具体解决办法也可以 google 一下。
其他平台的安装教程可以参考官方文档:https://www.genivia.com/downloads.html。
gSOAP 工具
gSOAP 提供了两个工具来方便开发人员使用 C/C++ 语言快速开发Web 服务应用,通过 gSOAP 提供的这两个工具,开发人员可以快速生成服务端与客户端代码框架,接下来开发人员只需要实现具体的接口函数即可。
wsdl2h
wsdl2h 工具根据 WSDL 文件生成 C/C++ .h 头文件。
WSDL(Web Service Description Language)即 Web 服务描述语言,它使用 XML 来对 Web 服务进行描述。
wsdl2h 的用法:
wsdl2h -o 头文件名 WSDL文件名或URL
例如:
wsdl2h -o calc.h http://www.genivia.com/calc.wsdl
wsdl2h 根据 URL 指定的 WSDL 生成calc.h头文件。calc.h对 Web 服务接口进行定义。
wsdl2h 支持额外的参数:
- -s 生成的头文件不使用 STL
- -o 文件名,指定输出头文件的名称
- -c 产生纯 C 代码,否则是 C++ 代码
- -t 文件名,指定 type map 文件,默认是
typemap.dat
soapcpp2
soapcpp2 工具则从上面生成的头文件生成 SOAP 服务端和客户端框架代码。例如对于上面的cacl.h,使用 soapcpp2 命令:
soapcpp2 -i -Iimport calc.h
soapcpp2 也支持额外的参数:
- -i 生成 C++ 包装类,客户端为
xxxProxy.h(.cpp),服务端为xxxService.h(.cpp) - -I 指定 import 的路径,比如需要引入
stlvector.h文件来支持 STL vector 的序列化 - -C 仅生成客户端代码
- -S 仅生成服务端代码
- -c 产生纯 C 代码,否则是 C++ 代码
- -x 不要产生 XML 示例文件
- -L 不要产生
soapClientLib.c和soapServerLib.c文件
例子
gSOAP 中包含了大量的例子以便让开发人员快速了解如何使用 gSOAP 开发 Web 服务。
我们以 gSOAP 的 samples 目录下的 calc++ 的代码为例,说明如何使用 gSOAP 来编写客户端和的服务端代码。
calc++ 目录已经包含了 calc.h 头文件,这个头文件跟上面我们使用 wsdl2h 生成的 calc.h 头文件并不完全相同,为了实验的方便,我们使用 calc++ 目录的calc.h 头文件进行实验。
calc.h头文件:
//gsoap ns service method: add Sums two values
int ns__add(double a, double b, double *result);
//gsoap ns service method: sub Subtracts two values
int ns__sub(double a, double b, double *result);
//gsoap ns service method: mul Multiplies two values
int ns__mul(double a, double b, double *result);
//gsoap ns service method: div Divides two values
int ns__div(double a, double b, double *result);
//gsoap ns service method: pow Raises a to b
int ns__pow(double a, double b, double *result);
然后,我们使用 soapcpp2 工具来生成客户端和服务端的框架代码:
soapcpp2 -i calc.h
客户端代码
calcclient.c++ 代码:
#include "soapcalcProxy.h"
#include "calc.nsmap"
const char server[] = "http://127.0.0.1:8080";
int main(int argc, char **argv)
{ if (argc < 4)
{ fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n");
exit(0);
}
double a, b, result;
a = strtod(argv[2], NULL);
b = strtod(argv[3], NULL);
calcProxy calc;
calc.soap_endpoint = server;
switch (*argv[1])
{ case 'a':
calc.add(a, b, &result);
break;
case 's':
calc.sub(a, b, &result);
break;
case 'm':
calc.mul(a, b, &result);
break;
case 'd':
calc.div(a, b, &result);
break;
case 'p':
calc.pow(a, b, &result);
break;
default:
fprintf(stderr, "Unknown command\n");
exit(0);
}
if (calc.error)
calc.soap_stream_fault(std::cerr);
else
printf("result = %g\n", result);
return 0;
}
由于代码使用 STL,为了顺利编译通过,需要将 gSOAP 中的stdsoap2.cpp和stdsoap2.h文件拷贝到客户端和服务端代码所在的目录。
改写好客户端代码后,使用 g++ 进行编译:
g++ -o calcclient++ calcclient.cpp soapC.cpp soapcalcProxy.cpp stdsoap2.cpp
编译顺利通过。
服务端代码
calcserver.cpp代码如下,其中可以指定服务端的端口号:
#include "soapcalcService.h"
#include "calc.nsmap"
int main(int argc, char **argv)
{ calcService calc;
if (argc < 2)
calc.serve(); /* serve as CGI application */
else
{ int port = atoi(argv[1]);
if (!port)
{ fprintf(stderr, "Usage: calcserver++ <port>\n");
exit(0);
}
/* run iterative server on port until fatal error */
if (calc.run(port))
{ calc.soap_stream_fault(std::cerr);
exit(-1);
}
}
return 0;
}
int calcService::add(double a, double b, double *result)
{ *result = a + b;
return SOAP_OK;
}
int calcService::sub(double a, double b, double *result)
{ *result = a - b;
return SOAP_OK;
}
int calcService::mul(double a, double b, double *result)
{ *result = a * b;
return SOAP_OK;
}
int calcService::div(double a, double b, double *result)
{ if (b)
*result = a / b;
else
{ char *s = (char*)soap_malloc(this, 1024);
(SOAP_SNPRINTF(s, 1024, 100), "<error xmlns=\"http://tempuri.org/\">Can't divide %f by %f</error>", a, b);
return soap_senderfault("Division by zero", s);
}
return SOAP_OK;
}
int calcService::pow(double a, double b, double *result)
{ *result = ::pow(a, b);
if (soap_errno == EDOM) /* soap_errno is like errno, but compatible with Win32 */
{ char *s = (char*)soap_malloc(this, 1024);
(SOAP_SNPRINTF(s, 1024, 100), "<error xmlns=\"http://tempuri.org/\">Can't take power of %f to %f</error>", a, b);
return soap_senderfault("Power function domain error", s);
}
return SOAP_OK;
}
然后使用 g++ 来对服务端代码进行编译:
g++ -o calcserver++ calcserver.cpp soapC.cpp soapcalcService.cpp stdsoap2.cpp
编译同样顺利通过。
测试
运行上面编译好的calcserver和calcclient可执行文件
来对 Web 服务进行测试,测试结果如下:


转自:https://blog.csdn.net/lihao21/article/details/70168050
参考资料
- https://www.cs.fsu.edu/~engelen/soapdoc2.html
- https://www.genivia.com/downloads.html
- https://www.genivia.com/dev.html
- http://blog.csdn.net/yangjun1115/article/details/29360389
- https://www.cs.fsu.edu/~engelen/calc.html
- http://commandos.blog.51cto.com/154976/130652
- http://www.cppblog.com/qiujian5628/archive/2008/10/11/54019.html
- http://blog.sina.com.cn/s/blog_5ee9235c0100de3g.html
gSOAP 初体验的更多相关文章
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
随机推荐
- hihoCoder.1513.小Hi的烦恼(bitset 五维偏序)
题目链接 五维偏序,对每一维维护bitset,表示哪儿为1(比它大),然后5个bitset与起来就能得到答案了. 具体实现可以用5*n个bitset,按排名搞个前缀和. 复杂度\(O(n^2/w)\) ...
- 支付宝支付集成过程中如何生成商户订单号(out_trade_no)
out_trade_no是指商户网站唯一订单号,在商户端唯一,每个商户订单号会对应一个支付宝订单号 ,此订单号由珊瑚自己生成,商户订单号要求64个字符以内.可包含字母.数字.下划线:需保证在商户端不重 ...
- spring和springMVC的面试问题总结
1.Spring中AOP的应用场景.Aop原理.好处? 答:AOP--Aspect Oriented Programming面向切面编程:用来封装横切关注点,具体可以在下面的场景中使用: Authen ...
- ext2文件系统学习(二)—— 目录磁盘结构
创建镜像.mount等操作和上一篇一样,测试目录结构如下: 一些文件系统信息如下: Block size: 1024 Inodes per group: 128 Inode ...
- AngularJS中使用$http对MongoLab数据表进行增删改查
本篇体验使用AngularJS中的$http对MongoLab数据表进行增删改查. 主页面: <button ng-click="loadCourse()">Load ...
- TThread深入分析
Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是 对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synch ...
- Delphi 中big5 转 Unicode 函数
function Big5ToUnicode(str Char): widestring; var len: integer; begin len:=MultiByteToWideChar(,,PCh ...
- 【转】浅谈分布式服务协调技术 Zookeeper
非常好介绍Zookeeper的文章, Google的三篇论文影响了很多很多人,也影响了很多很多系统.这三篇论文一直是分布式领域传阅的经典.根据MapReduce,于是我们有了Hadoop:根据GFS, ...
- Knockout.Js官网学习(Mapping插件)
前言 Knockout设计成允许你使用任何JavaScript对象作为view model.必须view model的一些属性是observable的,你可以使用KO绑定他们到你的UI元素上,当这些o ...
- CUDA_ERROR_OUT_OF_MEMORY
E tensorflow/stream_executor/cuda/cuda_driver.cc:1002] failed to allocate 198.83M (208486400 bytes) ...