使用Gsoap创建webservice(c++)

使用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 driverMonitorSoap.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., [email protected]

**  ----------------------------------------------------------------------------

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: urn:DriverMonitor

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)

root@worker:/opt/workspace/gsoap_headfiles/test# ll

total 216

drwxr-xr-x 2 root root  4096 3月  26 14:31 ./

drwxr-xr-x 6 root root  4096 3月  26 14:27 ../

-rw-r--r-- 1 root root   443 3月  26 14:31 driverMonitor.dataStream.req.xml

-rw-r--r-- 1 root root   461 3月  26 14:31 driverMonitor.dataStream.res.xml

-rw-r--r-- 1 root root   456 3月  26 14:31 driverMonitor.getAlarmType.req.xml

-rw-r--r-- 1 root root   460 3月  26 14:31 driverMonitor.getAlarmType.res.xml

-rw-r--r-- 1 root root   655 3月  26 14:31 driverMonitor.nsmap

-rw-r--r-- 1 root root   443 3月  26 14:31 driverMonitorSoap.h

-rw-r--r-- 1 root root  4442 3月  26 14:31 driverMonitor.wsdl

-rw-r--r-- 1 root root  1831 3月  26 14:31 ns.xsd

-rw-r--r-- 1 root root 78192 3月  26 14:31 soapC.cpp

-rw-r--r-- 1 root root 10476 3月  26 14:31 soapdriverMonitorService.cpp

-rw-r--r-- 1 root root  5613 3月  26 14:31 soapdriverMonitorService.h

-rw-r--r-- 1 root root 52952 3月  26 14:31 soapH.h

-rw-r--r-- 1 root root 14469 3月  26 14:31 soapStub.h

-rw-r--r-- 1 root root  1984 3月  26 14:31 soapTester.cpp

3.         添加生成的gsoap相关源码到工程目录

添加步骤2生成的源码到工程目录,项目不需要引入动态库。

工程结构:

├── CMakeLists.txt

├── CMakeLists.txt.user

├── drivermonitorhandle.cpp

├── driverMonitor.wsdl

├── include

│   ├── base64vimg.h

│   ├── data.h

│   ├── driver_monitor.h

│   ├── drivermonitorhandle.h

│   ├── driverMonitor.nsmap

│   ├── driverMonitorSoap.h

│   ├── face_detection.h

│   ├── face_landmark.h

│   ├── glog

│   │   ├── …

│   ├── mylogger.h

│   ├── ns.xsd

│   ├── service.h

│   ├── soapH.h

│   ├── soapStub.h

│   ├── stb_image.h

│   ├── stdsoap2.h

│   └── systeminfo.h

├── lib

├── main.cpp

├── mylogger.cpp

├── service.cpp

├── soapC.cpp

├── soapServer.cpp

├── stdsoap2.cpp

└── systeminfo.cpp

最后添加请求处理逻辑到工程中。

猜你喜欢

转载自www.cnblogs.com/apache11/p/10600024.html