• 使用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 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

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

  • 相关阅读:
    vue-element-admin中table分页改为前台处理
    vue项目如何部署到Tomcat中
    vuex之modules 热加载(hot update)
    持续学习
    css比较特殊选择器汇总(持续更新)
    关于伪元素before after总结
    ajax入门-实现省份下拉框
    super和this关键字的详解
    监听器
    当浏览器被关闭时,session是否被关闭?
  • 原文地址:https://www.cnblogs.com/apache11/p/10600024.html
Copyright © 2020-2023  润新知