Qt使用gSoap实现webservice服务端和客户端

2023-11-01

Qt使用gSoap实现webservice服务端和客户端

  1. gSoap官网。遇到问题时,官网往往是最能提供帮助的地方。

  2. 值得参考的链接。

    • gSoap使用心得: http://www.cppblog.com/qiujian5628/archive/2008/10/11/54019.html
    • gSoap接口定义: http://blog.sina.com.cn/s/blog_5ee9235c0100de3g.html
  3. Qt:使用gSoap做一个简单的CS系统_Jason’s home-CSDN博客

  4. 环境: Qt 5.14,win10, msvc2017 compiler

    工作原因没使用mingw,以后再确认,估计没啥事。

gSoap工具介绍

gSOAP是一个跨平台的,用于开发Web Service服务端和客户端的工具,在Windows、Linux、MAC OS和UNIX下使用C和C++语言编码,集合了SSL功能。

1、下载

  • 下载链接:https://www.genivia.com/products.html,下载开源版本
    在这里插入图片描述

  • 页面跳转,自动下载
    在这里插入图片描述

  • 压缩包

    image-20211009110050584

  • 解压缩到C盘

    比如:C:\gsoap-2.8\

2、Hello world: 开始使用SOAP api

使用gSOAP自动编码CLI工具和库,就可以轻松地使用和部署SOAP/XML Web服务api。

CLI 命令行界面(英语:command-line interface)是在图形用户界面(GUI)得到普及之前使用最为广泛的用户界面(User Interface),用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(CUI)。

例如,让我们实现一个简单的SOAP hello API,它接受一个名称并返回问候“hello name”。

SOAP API使用XML,但使用gSoup工具在实际开发时根本不需要使用XML,因为我们在c++中使用了gSOAP XML数据绑定,这使我们的代码比DOM或SAX更容易使用。我们的hello API在hello.h头文件中被简单地声明为一个(有**ns__**限定的XML命名空间)函数:

2.1 新建文件夹

比如:gSoapFoundation 文件夹;

2.2 新建服务接口头文件 hello.h

内容如下:

// hello.h
int ns__hello(std::string name, std::string& greeting);

2.3 使用 soapcpp2.exe

复制 soapcpp2.exe 到gSoapFoundation,和hello.h一起,亦可以通过设置path的方式代替

image-20211009113655031

程序路径:C:\gsoap-2.8\gsoap\bin\win64\soapcpp2.exe , 该处使用win64平台的程序

现在只需使用gSOAP soapcpp2 CLI 从 hello.h服务接口头文件中生成API源代码:

soapcpp2 hello.h

在这里插入图片描述

2.4、拷贝源代码库文件:

  • stdsoap2.h

  • stdsoap2.cpp

    从 C:\gsoap-2.8\gsoap\ 路径拷贝至gSoapFoundation中

image-20211009114231022

2.5 Qt 服务器程序

新建server项目,将 gSoapFoundation 文件夹 拷贝至工作目录。

#include "soapH.h"  // include the generated source code headers
#include "ns.nsmap" // include XML namespaces
#include <QDebug>

int main(int argc, char *argv[])
{
    // 定义soap环境
    struct soap recieveSoap;
    // 初始化环境
    soap_init(&recieveSoap);

    // 绑定环境/主机/端口/backlog
    soap_bind(&recieveSoap, "127.0.0.1", 23410, 100);

    while (true) {  // 死循环,类似监听
        // 接受客户端的连接
        int s = soap_accept(&recieveSoap);
        if (s < 0) {
            soap_print_fault(&recieveSoap, stderr);
            qDebug() << "error";
            exit(-1);
        }
        qDebug() << "Socket connection successful: slave socket =" << s;

        soap_serve(&recieveSoap);    // serve request, one thread, CGI style
        soap_end(&recieveSoap);      // dealloc data and clean up
    }

    return 0;
}
//server端的实现函数与 hello.h 中声明的函数相同,但是多了一个当前的soap连接的参数
int ns__hello(struct soap *soap, std::string name, std::string& greeting)
{
    greeting = "Hello " + name ;
    return SOAP_OK;
}

服务端需要导入的文件如下所示:

image-20211009132800712

编译运行,应该无误,可以通过网络浏览器打开页面,大体如下所示:

在这里插入图片描述

2.6 客户端

#include "soapH.h"  // include the generated source code headers
#include "ns.nsmap" // include XML namespaces

#include <QDebug>

int main(int argc, char *argv[])
{
    struct soap *soap = soap_new(); // new context
    std::string greeting;
    //该函数是客户端调用的主要函数,后面几个参数和 hello.h中声明的一样,前面多了3个参数,函数名是接口函数名ns__hello前面加上soap_call_
    if (soap_call_ns__hello(soap, "127.0.0.1:23410", NULL, "world", greeting) == SOAP_OK)
        qDebug() << greeting.data ();
    else
        soap_stream_fault(soap, std::cerr);
    soap_destroy(soap); // delete managed deserialized C++ instances
    soap_end(soap);     // delete other managed data
    soap_free(soap);    // free context
    return 0;
}

image-20211009133340407

编译运行,确保服务器已运行,调用服务器服务,获取数据,打印输出:

image-20211009133437004

3、总结

一个非常简单的例子,作为入门的实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt使用gSoap实现webservice服务端和客户端 的相关文章

  • 派生类在 PySide (Qt/PyQt) 中的错误线程中接收信号

    我在让派生类在 PySide 中正确接收信号时遇到问题 我在主 GUI 或命令行应用程序 线程的两个单独线程上使用发送器和接收器 线程是 QThread 对象 发送器和接收器在创建后立即使用 QObject moveToThread 移动到
  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单
  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 第一个随机数始终小于其余随机数

    我碰巧注意到 在 C 中 使用 std rand 方法调用的第一个随机数大多数时候都明显小于第二个随机数 关于 Qt 实现 第一个几乎总是小几个数量级 qsrand QTime currentTime msec qDebug lt lt q
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • Qt 人工鼠标点击无法正常工作

    小玩具应用程序可以在这里找到 http gist github com 517445 http gist github com 517445 我正在尝试将人工鼠标事件发送到小部件 我使用QApplication sendEvent为此 接下
  • 如何在 OS X 上的 Qt 应用程序中设置应用程序图标,足以进行分发?

    跟进这个答案 https stackoverflow com a 20918932 368896 to 这个问题 https stackoverflow com questions 20909341 what is the fastest
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • 完全彻底卸载QT Creator

    问题 如何从 Linux 机器上卸载 QT Creator 我的 Debian Jessie 机器上的安装已损坏 我尝试过重新安装 修复等 但没有成功 建议我完全卸载 获取最新版本并重新安装 问题是我不确定如何执行此操作 每次我尝试时 QT
  • 在 Qt 中使用多个不同的流读取同一文件

    使用 Qt 是否可以使用多个流读取文件以同时访问其中的不同数据部分 请注意 Qt 中的流 QTextStream QDataStream 不处理底层设备中的位置 流类只是一个包装器 用于更轻松地解析设备 QFile 实例 内的二进制数据 因
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor
  • 如何将自定义 Qt 类型与 QML 信号一起使用?

    我在 Qt 5 2 qml 应用程序中创建了一个自定义类型 class Setting public QObject Q OBJECT Q PROPERTY QString key READ key WRITE setKey Q PROPE
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我

随机推荐

  • 1-9、Lua协同程序

    1 9 Lua协同程序 文章目录 1 9 Lua协同程序 1 协同的基础 2 管道和过滤器 3 用作迭代器的协同 4 非抢占式多线程 协同程序 coroutine 与多线程情况下的线程比较类似 有自己的堆栈 自己的局部变量 有自己的指令指针
  • java基础快速入门--面向对象(基础)

    类与对象 看一个养猫问题 张老太养了两只猫 一只名字叫小白 今年三岁 白色 还有一只叫小花 今年一百岁 花色 请编写一个程序 当用户输入小猫的名字时 就显示该猫的名字 年龄 颜色 如果用户输入的小猫名错误 则显示张老太没有这只猫猫 使用现有
  • Althttpd 源码分析

    Althttpd 源码分析 主函数 main 主函数 http server函数 总结 main 主函数 int main int argc char argv int i 循环次数 char zPermUser 0 守护进程的用户权限 c
  • linux下使用迅雷的完美办法(免费)

    目前专利版权越来越严格了 对于我们这种常年linux下的人不得不说也算是件好事 国内麒麟希望能更加壮大 由于本人系统是ubuntu 最近一位亲人需要我帮忙下载一些电视剧 由于我平时只看点新闻 下载时才发现没有合适的地址 全部是迅雷或者百度影
  • kubectl create 命令使用

    目录 1 kubectl create 语法 示例 2 kubectl create clusterrole 语法 示例 3 kubectl create clusterrolebinding 语法 示例 4 kubectl create
  • JS逆向解析案例-巨潮证券市场数据库(python)

    目标网址 http webapi cninfo com cn marketDataZhishu 这篇文章是用来对该网站进行js解析用的 解析完后爬取数据操作可看这篇文章 Scrapy实战案例 将股票数据存入SQL数据库 解析重点 目标网址在
  • 前端常见的安全问题

    一 XSS Cross Site Scripting 跨站脚本攻击 通常指通过 HTML注入 篡改了网页 插入了恶意的脚本 从而在用户浏览网页时 获取用户信息 控制用户浏览器等的一种攻击 分类 持久性 存储型xss 指攻击者通过漏洞将恶意内
  • 预包装食品标签通则2019版_GB 7718《预包装食品标签通则》解读之四:配料表

    配料表属于 食品安全国家标准 预包装食品标签通则 明确规定在预包装食品标签标识中强制标示的内容 很多企业在产品配料表的标示方面还存在一些疑问 不少商家因为标示不慎而 吃 了官司 那么 作为生产者和经营者应该如何正确的标示配料表 本文针对相关
  • <QT>预览界面与实际输出界面不一样

    这是由于QT对于高分辨率的屏幕存在像素上的偏差 在main函数第一行加上以下代码 if QT VERSION gt QT VERSION CHECK 5 6 0 QCoreApplication setAttribute Qt AA Ena
  • 打包3阶段-使用Enigma Virtual Box打包为独立exe程序

    一 首先了解一下Enigma Virtual Box 百科 Enigma Virtual Box是软件虚拟化工具 它可以将多个文件封装到应用程序主文件 从而制作成为单执行文件的绿色软件 它支持所有类型的文件格式 虚拟化后的软件不释放任何临时
  • C语言程序设计超详细复习总结

    C语言 注意 要了解c语言的函数库 会使用里面的函数 如math h stdlib h库 rand 函数等 计算机元素 1 机器语言 机器指令的集合 机器指令 计算机能够识别的二进制代码 2 符号语言 汇编语言 一些英文字母和数字表示一个指
  • 制作双击可以直接运行的jar包

    原文地址 http www cnblogs com ylawrence3 archive 2009 11 08 1350645 html 1 JAR 文件包 JAR 文件就是 Java Archive File 顾名思意 它的应用是与 Ja
  • Android中启动一个服务,Android服务的两种启动方式

    前言 Service是Android的四大组件之一 也是可执行的程序 服务是Android中实现程序后台运行的解决方案 非常适合去执行那些不需要和用户交互而且还要求长期运行的任务 Service的启动方式有两种 总结一下两种方式的区别 一
  • Leetcode 14 string::find / substr

    思想 利用C string find 函数的特性 暴力匹配 重要特性 substr start length 如果 length 为 0 或负数 将返回一个空字符串 string find str 匹配返回首下标 不匹配返回string n
  • Idea Sonar使用说明

    1 Sonarlint安装 1 1 Idea在线安装 1 打开idea file 文件 setting 设置 1 插件搜索sonarlint进行安装 1 2 Idea离线安装 若idea 无法下载安装该插件 在idea https plug
  • opencv(十三)--边缘检测和梯度

    目标 图像梯度 图像边界等 使用到的函数有 cv2 Sobel cv2 Schar cv2 Laplacian 等 原理 梯度简单来说就是求导 OpenCV 提供了三种不同的梯度滤波器 或者说高通滤波器 Sobel Scharr 和Lapl
  • Qt 之 QVideoFrame转换为QImage

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 方法一 最简单 方法二 依赖opencv 方法三 qt5 15版本 前言 在qt框架下 实现相机预览的几种方式在qt相机预览已经描述过了 在该文章的几种方式中
  • 二叉搜索树(数组实现)

    内容 建立二叉搜索树 bool buildtree int k tree k value a index int cur 0 if index a size return true while 1 if a index lt tree cu
  • 正整数序列的数

    正整数序列的数 正整数序列的数量 问题描述 小明想知道 满足以下条件的正整数序列的数量 1 第一项为 n 2 第二项不超过 n 3 从第三项开始 每一项小于前两项的差的绝对值 请计算 对于给定的 n 有多少种满足条件的序列 输入格式 输入一
  • Qt使用gSoap实现webservice服务端和客户端

    文章目录 gSoap工具介绍 1 下载 2 Hello world 开始使用SOAP api 2 1 新建文件夹 2 2 新建服务接口头文件 hello h 2 3 使用 soapcpp2 exe 2 4 拷贝源代码库文件 2 5 Qt 服