当前位置: 首页 > news >正文

gsoap实现webservice服务

gsoap实现webservice服务

在实现Web服务时,使用gSOAP是一个很好的选择,因为它提供了强大的工具和库来创建SOAP和RESTful服务。gSOAP是一个C和C++语言开发的库,它支持SOAP协议的各种版本,包括SOAP 1.1和SOAP 1.2。下面是如何使用gSOAP来实现一个简单的Web服务的步骤:

1、下载gSOAP

Genivia Product Downloads

仅离线安装【二进制安装】需要下载

2、安装gSOAP

首先,你需要在你的系统上安装gSOAP。你可以从gSOAP的官方网站下载源代码或者使用包管理器安装。

-》在Ubuntu上安装

sudo apt-get install gsoap

-》在CentOS上安装

二进制安装【离线安装】
# 安装依赖项
sudo yum install g++ libtool autoconf automake make
# 解压并编译(使用下载的包)
tar -zxvf gsoap-2.8x.tar.gz  # 替换为你的gSOAP版本号
cd gsoap-2.8x                # 替换为你的gSOAP版本号
./configure
make
sudo make install
yum安装
sudo yum install gsoap

-》在Windows上安装

下载gSOAP的Windows版本,解压并设置环境变量,确保soapcpp2.exe等工具的路径被添加到你的系统路径中。

3、定义你的服务接口

-》手写方式

创建一个名为helloWorldService.h的文件

// helloWorldService.h// gSOAP header file for the calculator service// gSOAP SOAP Header file
// gSOAP service definition:
// gSOAP service definition generated from helloWorldService.h
// gSOAP XML binding for service: HelloWorldServiceBinding
// gSOAP service namespace: urn:HelloWorldNamespaceint sayHello(char *name, char **response); // 服务接口函数

-》工具使用helloWorld.wsd自动生成

如果先手工编写了wsdl(使用gSOAP的SOAP/XML schema语言定义你的Web服务接口)可以通过wsdl自动生成服务端代码(不包含实现逻辑)

soapcpp2 -j helloWorld.wsdl

这将生成一系列文件,包括soapC.cppsoapClient.cppsoapH.h等。 

-》wsdl实例

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"xmlns:tns="http://example.com/service"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"targetNamespace="http://example.com/service"><types><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:element name="SayHelloRequest" type="xsd:string"/><xsd:element name="SayHelloResponse" type="xsd:string"/></xsd:schema></types><message name="SayHelloRequest"><part name="parameters" element="tns:SayHelloRequest"/></message><message name="SayHelloResponse"><part name="parameters" element="tns:SayHelloResponse"/></message><portType name="GreetingPortType"><operation name="SayHello"><input message="tns:SayHelloRequest"/><output message="tns:SayHelloResponse"/></operation></portType><binding name="GreetingBinding" type="tns:GreetingPortType"><soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/><operation name="SayHello"><soap:operation soapAction="http://example.com/SayHello"/><input><soap:body use="encoded" namespace="http://example.com/service" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input><output><soap:body use="encoded" namespace="http://example.com/service" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output></operation></binding><service name="GreetingService"><port name="GreetingPort" binding="tns:GreetingBinding"><soap:address location="http://www.example.com/greeting"/></port></service></definitions>

4. 生成源代码

使用soapcpp2工具从你的.h文件生成源代码(不包含实现逻辑)。这包括C++服务器端代码、客户端存根和类型映射代码。

soapcpp2 -j helloWorldService.h

5. 实现服务逻辑

在生成的.cpp文件中实现你的服务逻辑。例如,在soapServer.cpp中:

#include "soapHelloWorldService.h"
#include "helloWorldService.nsmap"int main() {struct soap soap; // 创建soap对象实例helloWorldServiceBinding binding(&soap); // 绑定到SOAP服务实现if (!soap_valid_socket(soap_bind(&soap, NULL, 8080, 100))) { // 绑定到端口8080soap_print_fault(&soap, stderr); // 打印错误信息return -1;}if (soap_serve(&soap)) { // 处理请求soap_print_fault(&soap, stderr); // 打印错误信息}soap_destroy(&soap); // 清理内存资源soap_end(&soap); // 关闭连接和释放资源return 0;
}

编译和运行你的服务

编译你的服务代码,并运行它。确保链接了gSOAP库。例如:

g++ -o helloWorldServer soapServer.cpp soapC.cpp soapHelloWorldService.cpp stdsoap2.cpp -lgsoap++ -lpthread -lssl -lcrypto -lssl++ -lcrypto++ -lnsl -lsocket -lresolv -ldl -lm -lrt -lpthread -ldl -lgmp -lgmpxx -lgsl -lgslcblas -lgomp -lstdc++ -lstdc++fs -lboost_system -lboost_filesystem -lboost_thread -lboost_date_time -lboost_chrono -lboost_atomic -lboost_regex -lboost_random -lboost_program_options -lboost_iostreams -lboost_locale -lboost_context -lboost_stacktrace_noop -lboost_stacktrace_addr2line -lboost_timer -lboost_test_exec_monitor -lboost_prg_exec_monitor -lboost_unit_test_framework -lboost_log_setup -lboost_log -lboost_program_options -lboost_system -lboost_filesystem -lpthread -ldl -lm -lrt -lpthread -ldl -lgmp -lgmpxx -lgsl -lgslcblas -lgomp -lstdc++ -lstdc++fs
./helloWorldServer

测试你的服务

你可以使用gSOAP提供的客户端工具或者编写一个简单的客户端来测试你的SOAP服务。例如,创建一个客户端来调用sayHello方法:

1、获取wsdl

-》方式一:使用服务端提供的

当你运行服务器时,gSOAP 会自动在运行时提供一个 WSDL URL

通常是 http://localhost:8080/?wsdl

如果没有服务端就不是很正规了

-》方式二:用头文件手动生成

 你也可以手动生成 WSDL 文件:使用 wsdl2h 和 soapcpp2 来从你的头文件生成 WSDL 文件。例如:

# 注意这里的参数和用法可能需要根据实际gSOAP版本调整,具体请参考gSOAP文档。
# 通常wsdl2h是用来生成WSDL的,但直接从源代码生成WSDL可能不完全准确,因为它依赖于运行时信息。
# 通常建议在服务器运行时访问WSDL URL来获取最新信息
wsdl2h -ceg -o helloWorld.wsdl -t helloWorld.xsd helloWorld.h 

2、编写客户端代码

-》第一步:使用wsdl2h工具生成头文件

wsdl2h -o sayHello.h sayHello.wsdl

-》第二步:使用soapcpp2工具生成源代码

soapcpp2 -j helloWorld.h

-》第三步:编写C代码实现SOAP客户端

在你的项目中,创建一个新的C++源文件,例如helloWorld.cpp,并编写客户端代码来调用SOAP服务。

#include "helloWorld.h" // 包含由soapcpp2生成的头文件
#include "helloWorld.nsmap" // 可能由soapcpp2生成,包含命名空间映射
#include <iostream>int main() {struct soap soap; // 创建soap环境soap_init(&soap); // 初始化soap环境soap.send_timeout = 10; // 设置发送超时时间(秒)soap.recv_timeout = 10; // 设置接收超时时间(秒)soap.connect_timeout = 10; // 设置连接超时时间(秒)// 实例化服务端点URL和命名空间const char *endpoint = "http://example.com/helloWorld"; // SOAP服务的URLconst char *action = ""; // SOAP action(如果有)struct ns__yourServiceFunctionName soap_response; // 根据WSDL定义的函数名和参数类型创建结构体实例// 调用SOAP服务函数(替换yourServiceFunctionName为实际的函数名)if (soap_call_ns__yourServiceFunctionName(&soap, endpoint, NULL, action, /* 传递参数 */, &soap_response) == SOAP_OK) {// 处理响应数据std::cout << "Response received: " << soap_response._yourResponseField << std::endl; // 输出响应数据(替换yourResponseField为实际的响应字段名)} else {std::cerr << "Error in soap_call_ns__yourServiceFunctionName" << std::endl;soap_print_fault(&soap, stderr); // 打印错误信息}soap_end(&soap); // 清理soap环境soap_done(&soap); // 完全销毁soap环境return 0;
}

2、编译和运行客户端

使用gSOAP提供的soapcpp2生成的.cpp文件和你的client.cpp文件一起编译。例如:

g++ -o client client.cpp soapC.cpp soapClient.cpp -lgsoap++ # 根据你的系统和gSOAP版本,可能需要调整编译命令和链接库选项

然后运行生成的客户端程序:

./client

注意

  • 确保替换代码中的yourServiceFunctionNameyourResponseField、服务URL以及任何特定的参数和命名空间以匹配你的实际SOAP服务。

  • 检查WSDL文件以确保所有细节正确无误,包括命名空间、方法名、参数类型等。

  • 根据需要调整超时设置以适应网络条件。

通过上述步骤,你应该能够创建一个简单的C++ SOAP服务端、客户端来,并测试你的SOAP服务。

说明

1、当运行服务器时,gSOAP 会自动在运行时提供一个 WSDL URL

通常是 http://localhost:8080/?wsdl

如果没有实现这一功能,那么服务端就不正规

相关文章:

gsoap实现webservice服务

gsoap实现webservice服务 在实现Web服务时&#xff0c;使用gSOAP是一个很好的选择&#xff0c;因为它提供了强大的工具和库来创建SOAP和RESTful服务。gSOAP是一个C和C语言开发的库&#xff0c;它支持SOAP协议的各种版本&#xff0c;包括SOAP 1.1和SOAP 1.2。下面是如何使用gSO…...

容联云联络中心AICC:深度整合DeepSeek,业务验证结果公开

容联云重磅推出AICC3.2版本&#xff0c;实现了智能化的升级与外呼效率的突破——深度整合DeepSeek-R1大模型、预测式外呼在数据分析侧的增强、全渠道路由能力、一键多呼效率的强化。 同时&#xff0c;全面接入DeepSeek-R1的容联云 AICC3.2 &#xff0c;目前已与某知名汽车金融企…...

腿足机器人之七- 逆运动学

腿足机器人之七- 逆运动学 基本概念腿部运动的数学表示坐标系定义以及自由度说明正运动学模型 逆运动学求解几何解法数值迭代法雅可比矩阵法基础双足机器人步态规划中的雅可比法应用 工程挑战与解决方案实际应用中的工具和算法多解问题高自由度机器人&#xff08;如Atlas的28自…...

快速点位排查问题的方法

一、核心思路&#xff1a;缩小问题范围 1. 分治法&#xff08;Divide and Conquer&#xff09; 原理&#xff1a;将复杂系统拆分为独立模块&#xff0c;逐层验证。示例&#xff1a; 网络问题&#xff1a;检查客户端 → 本地网络 → 服务器 → 数据库。代码问题&#xff1a;注…...

【前端】Vue组件库之Element: 一个现代化的 UI 组件库

文章目录 前言一、官网1、官网主页2、设计原则3、导航4、组件 二、核心功能&#xff1a;开箱即用的组件生态1、丰富的组件体系2、特色功能亮点 三、快速上手&#xff1a;三步开启组件化开发1、安装&#xff08;使用Vue 3&#xff09;2、全局引入3、按需导入&#xff08;推荐&am…...

一文搞懂Android应用元素查看器(Appium+Appium-inspector)——定位微信布局元素

Appium和Appium Inspector是怎么协作的呢?Appium 与 Appium Inspector 的版本匹配Appium安装启动appium服务安装Appium inspector客户端查看安卓真机指定app布局元素(这里以微信为例,需要保持与模拟器或真机一直连接)【QA】解决顶部工具栏上Refresh Source & Screensho…...

matlab质子磁力仪传感器线圈参数绘图

1、内容简介 matlab134-质子磁力仪传感器线圈参数绘图 可以交流、咨询、答疑 2、内容说明 略 线圈是质子磁力仪传感器的核心&#xff0c;其品质直接影响着仪器的测量精度 。 结合反向串联圆柱体线圈模型&#xff0c;对约束设计 的因素进行分析; 建立约束参数与设计参数之间…...

WPF快速创建DeepSeek本地自己的客户端-基础思路版本

开发工具&#xff1a;VS 2015 开发环境&#xff1a;.Net 4.0 使用技术&#xff1a;WPF 本篇文章内容&#xff1a; 本地部署DeepSeek以后一般使用网页工具&#xff08;如Chatbox&#xff09;或者DOS窗口与其对话。本篇文章使用WPF创建一个基础版的对话工具。 一、搭建本地DeepS…...

FreeRTOS第12篇:系统的“绿色通道”——中断管理与临界区

文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 引言:嵌入式系统的“紧急电话” 想象你正在主持一场重要会议:大部分时间按议程推进(任务执行),但偶尔会有紧急来电(硬…...

SpringBoot+Vue+数据可视化的动漫妆造服务平台(程序+论文+讲解+安装+调试+售后等)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今数字化高速发展的时代&#xff0c;动漫产业迎来了前所未有的繁荣&#xff0c;动漫…...

CentOS 7超详细安装教程(含镜像)

1. 安装前准备 1.1 CentOS简介 CentOS&#xff08;Community Enterprise Operating System&#xff0c;中文意思是&#xff1a;社区企业操作系统&#xff09;是一种基于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建的免费开源操作系统。它在稳定性、安全…...

一种棋牌网游的玩法

起因 俺是个记性不好的人&#xff0c;经常记不住牌&#xff0c;所以很少能赢。于是俺就写了个程序来记录出过的牌。 开始 因为是网游&#xff0c;所以就开始监听网络包。因为不需要改网络包&#xff0c;所以俺就选择了cap_ip。cap_ip是一个通过设置网卡混乱模式来监听网络包…...

9.综合调试|输入不能存在空格|desc存在None|输出权值和ID|函数重名|修改文件名|权值和实际关键词出现次数(C++)

输入不能存在空格 目前输入的关键词时每隔一空格内容分别进行搜索&#xff0c;大部分时候我们都是将一串包含空格的内容直接进行搜索&#xff0c;需要将代码改进。 将cin换为fgets #include "searcher.hpp" #include <iostream> #include <cstdio> #in…...

使用SHOW PROCESSLIST和SHOW ENGINE INNODB STATUS排查mysql锁等待问题

现象&#xff1a; mysql 查某表一直不能结束&#xff0c;查别的表没有问题。已知之前刚刚alter此表想把它的一个字段长度增长&#xff0c;但是这个操作一直没有结束。现在应该怎么办? 方案: 使用 SHOW PROCESSLIST; 查看当前所有活动的SQL线程&#xff0c;找出是否有长时间…...

ElasticSearch映射分词

目录 弃用Type why 映射 查询 mapping of index 创建 index with mapping 添加 field with mapping 数据迁移 1.新建 一个 index with correct mapping 2.数据迁移 reindex data into that index 分词 POST _analyze 自定义词库 ik分词器 circuit_breaking_excep…...

JVM——堆的回收:引用计数发和可达性分析法、五种对象引用

目录 引用计数法和可达性分析法 引用计数法&#xff1a; 可达性分析算法&#xff1a; 五种对象引用 软引用&#xff1a; 弱引用&#xff1a; 引用计数法和可达性分析法 引用计数法&#xff1a; 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&…...

PosgreSQL比MySQL更优秀吗?

一日&#xff0c;一群开发者对PosgreSQL是不是比MySQL更优秀进行了激烈的辩论&#xff0c;双方吵的都要打起来了 正方有以下理由&#xff1a; PostgreSQL严格遵循SQL标准规范&#xff0c;相较MySQL在语法兼容性和功能完整性方面展现出更强的体系化设计&#xff0c;尤其在事务处…...

冒险岛079 V8 整合版源码搭建教程+IDEA启动

今天教大家来部署下一款超级怀旧游戏冒险岛&#xff0c;冒险岛源码是开源的&#xff0c;但是开源的代码会有各种&#xff0c;本人进行了加工整合&#xff0c;并且用idea进行了启动测试&#xff0c;经过修改后没有任何问题。 启动截图 后端控制台 前端游戏界面 声明 冒险岛源码…...

基于Python的Flask微博话题舆情分析可视化系统

2024数据 ✅️标价源码 远程部署加 20 ✅️爬虫可用 有六月数据 ✅️修复bug不会突然打不开网页 系统稳定 系统的功能如下: 1.数据的爬取 2.用户的登录注册 3.热词统计&#xff0c;舆情统计 4.文章统计分析 5.发布地址统计 6.评论统计 7.情感分类统计 编程语言&#xff1a;py…...

ms-swift3 序列分类训练

目录 引言 一、数据集准备 二、训练/推理代码 2.1 训练 2.2 推理 三、性能验证 引言 swift 3.x支持了序列分类Command Line Parameters — swift 3.2.0.dev0 documentation 想尝试一下用多模态&#xff08;图像&#xff09;的序列分类与普通的图像分类任务有啥区别 一、…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...