C及C++的SOAP协议库
一.gSOAP
gSOAP 是一个功能强大的开源工具包,专为 C 和 C++ 设计,用于快速开发基于 SOAP 协议的 Web 服务和客户端。
1.协议支持
SOAP 版本:完整支持 SOAP 1.1/1.2 规范,包括消息格式、编码规则和错误处理。
传输协议:支持 HTTP、HTTPS、SMTP、JMS 等,可扩展自定义传输层。
标准兼容性:兼容 WS-* 系列标准(如 WS-Security、WS-Addressing),支持 RESTful API。
2.代码生成工具
WSDL 解析:通过 wsdl2h 工具将 WSDL 文件转换为 C/C++ 头文件。
自动绑定:使用 soapcpp2 工具生成客户端 / 服务器代码,无需手动编写 SOAP 消息。
数据类型映射:自动将 XML 模式映射为 C/C++ 数据结构,支持复杂类型(如数组、嵌套结构)。
3.跨平台与性能
操作系统:支持 Windows、Linux、macOS、iOS、Android 等。
嵌入式支持:轻量级设计(单线程内存占用 <100KB),适合资源受限设备。
线程安全:支持多线程环境,提供可重入 API。
4.高级功能
二进制优化:支持 MTOM/XOP 协议,高效传输大型二进制数据(如图像、视频)。
安全增强:集成 OpenSSL 实现 HTTPS、WS-Security(用户名令牌、数字签名)。
异步通信:支持非阻塞 I/O 和事件驱动模式,适合高并发场景。
5.下载地址: https://sourceforge.net/projects/gsoap2/files/
6.开发流程
(1)定义接口:编写 WSDL 文件或直接用 C/C++ 头文件定义服务接口。
(2)生成代码:
wsdl2h -o service.h service.wsdl # 从 WSDL 生成头文件
soapcpp2 -c service.h # 生成 C 代码(-C 生成 C++ 代码)
(3)服务实现示例
#include "soapH.h"
#include "service.nsmap"
int ns__add(struct soap *soap, double a, double b, double *result) {
*result = a + b;
return SOAP_OK;
}
int main() {
struct soap soap;
soap_init(&soap);
soap_register_function(&soap, "add", "a:double,b:double", "result:double", ns__add);
soap_serve(&soap); // 启动服务
soap_destroy(&soap);
return 0;
}
二.KD SOAP(QT SOAP, 第三方模块)
1.简介
KD SOAP 是专为 C++ 设计的现代 SOAP 协议库,特别针对 Qt 框架进行了优化,提供简洁的 API 和高效的实现。作为 Qt 生态的一部分,它无缝集成了 Qt 的信号槽机制、网络模块和 XML 处理能力,非常适合开发跨平台的桌面、移动和嵌入式应用。
2.官网: https://www.kdab.com/development-resources/qt-tools/kd-soap/
下载:https://github.com/KDAB/KDSoap
3.特点
(1).Qt 深度集成
信号槽机制:异步操作通过信号槽回调,避免复杂的回调函数管理。
Qt 数据类型兼容:直接使用 QString、QByteArray、QVariant 等类型,无需额外转换。
Qt 网络模块:基于 QNetworkAccessManager,支持 HTTP/HTTPS、代理和 SSL/TLS。
(2).现代 C++ 设计
RAII 资源管理:自动管理 SOAP 会话和内存,减少内存泄漏风险。
STL 兼容性:支持标准容器(如 std::vector)和迭代器。
异常安全:可选的异常处理机制(需启用编译选项)。
(3).协议支持
SOAP 版本:支持 SOAP 1.1 和 1.2,自动处理消息格式差异。
WSDL 解析:内置 WSDL 解析器,支持从 WSDL 生成客户端代码。
WS- 扩展*:部分支持 WS-Security(用户名令牌)、WS-Addressing。
(4).跨平台与性能
操作系统:Windows、Linux、macOS、iOS、Android 等 Qt 支持的平台。
线程安全:设计上支持多线程,需注意共享对象的同步。
内存优化:使用 Qt 的隐式共享(Copy-on-Write)技术减少内存开销。
4.定义服务接口
方法一:直接使用 WSDL 文件(通过 kdsdl2cpp 工具生成代码)。
方法二:手动编写 C++ 类继承 SoapClient。
5.kd-soap client示例代码
(1)helloworld_client.h
#ifndef HELLOWORLD_CLIENT_H
#define HELLOWORLD_CLIENT_H
#include "wsdl_helloworld.h"
#include <QWidget>
QT_BEGIN_NAMESPACE
class QLineEdit;
class QTextBrowser;
QT_END_NAMESPACE
class MainWindow : public QWidget
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
private Q_SLOTS:
void sayHello();
void sayHelloDone(const QString &reply);
void sayHelloError(const KDSoapMessage &fault);
private:
Hello_Service m_service;
QLineEdit *m_input;
QTextBrowser *m_browser;
};
#endif // HELLOWORLD_CLIENT_H
(2)main.cpp
#include "helloworld_client.h"
#include <QApplication>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QTextBrowser>
#include <QVBoxLayout>
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent)
{
m_service.setEndPoint(QLatin1String("http://localhost:8081"));
m_service.setSoapVersion(KDSoapClientInterface::SOAP1_2);
connect(&m_service, &Hello_Service::sayHelloDone, this, &MainWindow::sayHelloDone);
connect(&m_service, &Hello_Service::sayHelloError, this, &MainWindow::sayHelloError);
QVBoxLayout *layout = new QVBoxLayout(this);
m_browser = new QTextBrowser;
QLabel *label = new QLabel;
label->setWordWrap(true);
label->setText(tr("<qt><p>This is a simple client/server demo. Start bin/helloworld_server separately on the commandline.</p>"
"<p>Clicking "Send" will make a sayHello() soap call. To trigger an error, leave the input field empty and click "
""Send".</p>"));
layout->addWidget(label);
layout->addWidget(m_browser);
QWidget *w1 = new QWidget;
QHBoxLayout *l1 = new QHBoxLayout(w1);
l1->setContentsMargins(0, 0, 0, 0);
m_input = new QLineEdit;
l1->addWidget(m_input);
QPushButton *pb1 = new QPushButton(tr("Send"));
l1->addWidget(pb1);
connect(m_input, &QLineEdit::returnPressed, this, &MainWindow::sayHello);
connect(pb1, &QAbstractButton::clicked, this, &MainWindow::sayHello);
layout->addWidget(w1);
m_input->setFocus();
}
void MainWindow::sayHello()
{
m_service.asyncSayHello(m_input->text().trimmed());
m_input->clear();
}
void MainWindow::sayHelloDone(const QString &reply)
{
m_browser->append(tr("Reply from server: <font color=\"darkgreen\">%1</font>").arg(reply));
}
void MainWindow::sayHelloError(const KDSoapMessage &fault)
{
m_browser->append(tr("Error from server: <font color=\"red\">%1</font>").arg(fault.faultAsString()));
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MainWindow mw;
mw.show();
return app.exec();
}
6.典型应用场景
Qt 应用集成
为 Qt 桌面应用(如编辑器、工具软件)添加 Web 服务功能。
示例:财务软件连接银行支付接口。
移动应用开发
通过 SOAP 协议与后端服务通信的 Qt Quick 应用。
优势:一次开发,同时支持 iOS 和 Android。
物联网设备管理
嵌入式设备(如工业控制器)通过 SOAP 协议接入云平台。
结合 Qt IoT 框架实现端到端解决方案。
企业系统对接
连接企业现有 SOAP 服务(如 ERP、CRM 系统)的 Qt 客户端。
三.各个库对比