一.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 客戶端。
三.各個庫對比