使用Gsoap创建WebService
(c++)
1. 下载编译Gsoap
gSOAP工具包是用于SOAP和REST XML Web服务以及通用C / C ++ XML数据绑定的C和C ++软件开发工具包。 该工具包分析WSDL和XML模式(单独或作为组合集),并将XML模式类型和SOAP / REST XML消息传递协议映射为易于使用且高效的C和C ++代码。 它还支持通过自动生成XML序列化代码和WSDL规范将(传统)C和C ++应用程序作为XML Web服务公开。
下载Gsoap2.8:Gsoap下载地址:https://sourceforge.net/projects/gsoap2/files
解压,编译,安装后,
解压目录/gsoap/目录下,找到stdsoap2.c,stdsoap2.cpp,stdsoap2.h三个文件,后续需要引入。
2. 编写webservice所需头文件
2.1 编写imageRg.h文件,实例如下:(标注区域都需要根据实际情况替换)
//gsoap ns service name: imageRg
//gsoap ns service namespace: http://localhost/imageRg.wsdl
//gsoap ns service location: http://localhost
//gsoap ns service executable: imageRg.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:imageRg
int ns__getPlateID(std::string imgdata, std::string &plateID);
2.2 根据gosap工具生成源文件
Soapcpp2是一个根据.h文件生成若干支持webservice的代码生成工具,生成的代码文件包括webservice客户端和服务器的实现框架,XML数据绑定等,具体说明如下:
文件 |
描述 |
soapStub.h |
根据输入的.h文件生成的数据定义文件,一般我们不直接引用它。 |
soapH.h soapC.cpp |
客户端和服务器端应包含该头文件,它包含了soapStub.h。针对soapStub.h中的数据类型,cpp文件实现了序列化、反序列化方法。 |
soapXYZProxy.h soapXYZProxy.cpp |
这两个文件用于客户端,是客户端调用webservice的框架文件,我们的代码主要在此实现或从它继承。 |
soapXYZService.h soapXYZService.cpp |
这两个文件用于服务器端,是服务器端实现webservice的框架文件,我们的代码主要在此实现或从它继承。 |
.xsd |
传输消息的schema,,我们可以看看是否满足我们的协议格式(如果有此要求) |
.wsdl |
这个就不用说了。 |
.xml |
满足webservice定义的例子message,即实际的传输消息,我们可以看看是否满足我们的协议格式(如果有此要求)。 |
.nsmap |
命名空间的定义,对命名空间不敏感的,不用关注。 |
使用soapcpp2时,可选项如下:
选项 |
描述 |
-1 |
Soap1.1绑定 |
-2 |
SOAP1.2绑定 |
-C |
只生成客户端代码 |
-S |
只生成服务器端代码 |
-T |
生成自动测试代码 |
-L |
不生成 soapClientLib/soapServerLib |
-a |
用 SOAPAction 和WS-Addressing调用服务器端方法 |
-A |
用 SOAPAction 调用服务器端方法 |
-b |
采用char[N]这样的方式来表示string |
-c |
生成的是C代码,不是C++代码 |
-d < path > |
将代码生成在 < path >下 |
-e |
生成 SOAP RPC 样式的绑定 |
-f N |
File split of N XML serializer implementations per file |
-h |
显示一个简要的用法信息 |
-i |
生成的服务代理类和对象从struct soap继承而来 |
-j |
生成的服务代理类和对象包含struct soap而来(C代码的唯一选择) |
-I < path > |
包含其他文件时使用,指明 < path > (多个的话,用`:'分割),相当于#import ,该路径一般是gSOAP目录下的import目录,该目录下有一堆文件供soapcpp2生成代码时使用。 |
-n |
用于生成支持多个客户端和服务器端(具体内容参考gSOAP文档) |
-p < name > |
生成的文件前缀采用< name > ,而不是缺省的 "soap" |
-q < name > |
C++代码中,所有声明的命名空间 |
-s |
生成的代码在反序列化时,严格检查XML的有效性 |
-t |
生成的代码在发送消息时,采用xsi:type方式 |
-u |
在 WSDL/schema 输出文件中不产生XML注释 |
-v |
显示版本信息 |
-w |
不生成 WSDL 和 schema 文件 |
-x |
不生成 XML 形式的传输消息文件 |
-y |
在XML 形式的传输消息文件中,包含 C/C++类型信息 |
实例:
在头文件所在目录执行:
root@worker:/opt/workspace/gsoap_headfiles/test# soapcpp2 -S -j -T resq.h
** The gSOAP code generator for C and C++, soapcpp2 release 2.8.70
** Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc.
** All Rights Reserved. This product is provided "as is", without any warranty.
** The soapcpp2 tool and its generated software are released under the GPL.
** ----------------------------------------------------------------------------
** A commercial use license is available from Genivia Inc., contact@genivia.com
** ----------------------------------------------------------------------------
Saving soapStub.h annotated copy of the source interface file
Saving soapH.h serialization functions to #include in projects
driverMonitorSoap.h(9): *WARNING*: Cannot use document style with SOAP encoding
Using ns service name: driverMonitor
Using ns service style: document
Using ns service encoding: literal
Using ns service location: http://localhost
Using ns service executable: DriverMonitor.cgi
Using ns schema namespace: resq
Saving driverMonitor.wsdl Web Service description
Saving soapdriverMonitorService.h service class
Saving soapdriverMonitorService.cpp service class
Saving driverMonitor.dataStream.req.xml sample SOAP/XML request
Saving driverMonitor.dataStream.res.xml sample SOAP/XML response
Saving driverMonitor.getAlarmType.req.xml sample SOAP/XML request
Saving driverMonitor.getAlarmType.res.xml sample SOAP/XML response
Saving driverMonitor.nsmap namespace mapping table
Saving soapTester.cpp auto-test echo server
Saving ns.xsd XML schema
Saving soapC.cpp serialization functions
Compilation successful (1 warning)
3. 添加生成的gsoap相关源码到工程目录
添加步骤2生成的源码到工程目录,项目不需要引入动态库。
工程结构:
├── CMakeLists.txt
├── CMakeLists.txt.user
├── drivermonitorhandle.cpp
├── driverMonitor.wsdl
├── include
│ ├── base64vimg.h
│ ├── data.h
│ ├── driver_monitor.h
│ ├── drivermonitorhandle.h
│ ├── driverMonitor.nsmap
│ ├── glog
│ │ ├── …
│ ├── ns.xsd
│ ├── soapH.h
│ ├── soapStub.h
│ ├── stdsoap2.h
├── lib
├── soapC.cpp
├── soapServer.cpp
├── stdsoap2.cpp
最后添加请求处理逻辑到工程中。