Ubuntu22 上,用C++ gSoap 創建一個簡單的webservice

創建calc.h

// calc.h
// gSOAP 服務定義
int ns__add(double a, double b, double &result);
int ns__subtract(double a, double b, double &result);

==========================

創建my_server.cpp

#include "soapService.h"
#include "ns.nsmap"?

class MyService : public Service {
public:
int add(double a, double b, double &result) override {
result = a + b;
return SOAP_OK;
}
int subtract(double a, double b, double &result) override {
result = a + b;
return SOAP_OK;
}
};

int main() {
MyService service;
service.run(8080); // 啟動服務
return 0;
}

========================

在soapService.cpp

增加兩個函數

int Service::add(double a, double b, double &result) {
result = a + b;
return SOAP_OK;
}

int Service::subtract(double a, double b, double &result) {
result = a - b;
return SOAP_OK;
}

==============================

用C++風格,編譯生成server

g++ -std=c++11 my_server.cpp soapC.cpp soapService.cpp -o server -lgsoap++

運行

./server

===============================

查看namespace

root@102:/usr/local/src/testCode# cat ns.wsdl <?xml version="1.0" encoding="UTF-8"?> <definitions name="Service" targetNamespace="http://tempuri.org/ns.xsd/Service.wsdl" xmlns:tns="http://tempuri.org/ns.xsd/Service.wsdl" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="http://tempuri.org/ns.xsd"

------------------

ns?前綴對應的URIhttp://tempuri.org/ns.xsd,后面的curl測試會用的namespace -----H 'SOAPAction: "http://tempuri.org/ns.xsd#add"' \

------------------------

用curl 測試

curl -X POST http://localhost:8080 \
-H "Content-Type: text/xml" \
-H 'SOAPAction: "http://tempuri.org/ns.xsd#add"' \
-d '<soapenv:Envelope?
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="http://tempuri.org/ns.xsd">
<soapenv:Header/>
<soapenv:Body>
<ns:add>
<a>10.5</a>
<b>2.3</b>
</ns:add>
</soapenv:Body>
</soapenv:Envelope>'

===============================

您觀察到的現象是正確的,這是因為您使用了?-S?選項(生成純 C 代碼風格的服務端),而之前的示例是基于 C++ 風格的代碼生成(使用?-j?選項)。以下是詳細解釋和解決方案:


1. 關鍵區別:-S?和?-j?選項

選項生成文件命名代碼風格適用場景
-SsoapService.cppC 風格(函數式)純 C 項目
-jsoap**calc**Service.cppC++ 風格(面向對象)C++ 項目

您的命令?soapcpp2 -j -S -x calc.h?中:

  • -j?和?-S?同時存在時,-S?優先級更高,因此生成的是 C 風格文件?soapService.cpp

  • 如果去掉?-S,會生成 C++ 風格的?soapcalcService.cpp


2. 生成的文件說明(您的實際輸出)

文件名用途
soapService.cppC 風格的服務端框架(等效于?soapcalcService.cpp?的 C 版本)
soapService.h服務端頭文件
soapC.cpp公共序列化代碼
ns.wsdlWSDL 服務描述文件
ns.nsmap命名空間映射表

3. 如何生成 C++ 風格代碼?

移除?-S?選項,僅保留?-j

bash

soapcpp2 -j -x calc.h

此時會生成:

  • soapcalcService.cpp(C++ 服務端框架)

  • calcService.h(C++ 服務類頭文件)


4. 您的下一步選擇

選項 1:繼續使用 C 風格(當前生成的文件)
  • 服務端實現示例(直接修改?soapService.cpp):

    c

    #include "soapH.h"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_serve(&soap); // 啟動服務(默認端口8080)return 0;
    }
  • 編譯命令

    bash

    gcc soapService.cpp soapC.cpp -o server -lgsoap
選項 2:改用 C++ 風格(推薦)

重新生成代碼:

bash

soapcpp2 -j -x calc.h
  • 服務端實現示例(繼承?calcService?類):

    cpp

    #include "calcService.h"class MyService : public calcService {
    public:int add(double a, double b, double &result) override {result = a + b;return SOAP_OK;}
    };int main() {MyService service;service.run(8080); // 啟動服務return 0;
    }
  • 編譯命令

    bash

    g++ -std=c++11 my_server.cpp soapC.cpp soapcalcService.cpp -o server -lgsoap++

5. 為什么文件名不同?

  • C 風格:統一命名為?soapService.cpp

  • C++ 風格:文件名包含接口前綴(如?soap**calc**Service.cpp),便于多接口區分。


總結

  • 您當前生成的是?C 風格?代碼(因?-S?選項)。

  • 如需 C++ 風格,移除?-S?并保留?-j

  • 兩種風格功能等效,選擇取決于項目需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90397.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90397.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90397.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java(LinkedList和ArrayList底層分析)

LinkedList全面說明:LinkedList底層操作機制:LinkedList的方法:add():增加節點對象remove():刪除一個節點對象(默認刪除第一個節點對象)set():修改一個節點對象get():得到一個節點對象LinkedList的遍歷:增強for循環迭代器普通for循化LinkedList的源碼解讀:增加源碼:1. LinkedLi…

開源項目XBuilder的user邏輯

stores \ userquery-keys.ts 統一管理Vue Query&#xff08;TanStack Query的Vue適配版本&#xff09;緩存鍵&#xff0c;在下面的文件中復用index.ts 入口文件&#xff0c;統一用戶信息查詢signed-in.ts 登錄狀態管理、認證邏輯在用戶登錄后&#xff0c;系統頒發一個令牌&…

第十五章 SEO的簡單免費工具

SEO的基礎工具和檢測 前文中主要是講一些SEO的網站基本功&#xff0c;而在這一章那&#xff0c;會講到一些非常基本的工具&#xff0c;主要是關于&#xff1a;網站的流量、停留時長、關鍵詞密度、內容、以及Google的站長工具。 Google Search Console Google Search Console這是…

SSL 證書與 HTTPS 的關系:一文理清核心關聯

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;和 SSL 證書&#xff08;Secure Sockets Layer Certificate&#xff09;是網絡安全的兩大基石&#xff0c;它們共同保障了互聯網通信的安全性和可信度。以下從定義、功能、關系及實際應用層面進行解析&#xf…

使用Jmeter參數化實現接口自動化測試

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文記錄如何使用Jmeter參數化&#xff08;csv)實現接口自動化——測試Token不同入參情況下&#xff0c;接口請求能夠返回正確的結果1. 首先需要使用Jmeter獲取一個…

X-plore File Manager v4.34.02 修改版:安卓設備上的全能文件管理器

在使用安卓設備時&#xff0c;文件管理是日常操作中不可或缺的一部分。X-plore File Manager 作為一款功能強大的文件管理器&#xff0c;憑借其豐富的功能和便捷的操作&#xff0c;成為安卓用戶管理文件的首選工具之一。最新版 v4.34.02 修改版更是解鎖了更多高級功能&#xff…

React+threejs兩種3D多場景渲染方案

在現代 Web 開發中&#xff0c;3D 可視化需求日益增長&#xff0c;特別是在 React 生態系統中實現多 3D 場景的展示與交互。本文通過對比兩種實現方案&#xff0c;探討 React 中構建多 3D 場景的最佳實踐&#xff0c;分析它們的技術特點、性能表現和適用場景。方案一&#xff1…

React性能優化終極指南:memo、useCallback、useMemo全解析

掌握 React.memo、useCallback、useMemo 的正確使用姿勢&#xff0c;讓你的 React 應用性能飛起來&#xff01; &#x1f3af; React.memo 作用 React.memo 是一個高階組件&#xff0c;用于函數組件&#xff0c;通過淺比較 props 的變化來決定是否重新渲染。如果 props 沒有變…

借助 VR 消防技術開展應急演練,檢驗完善應急預案?

應急演練是企業應對火災事故的重要手段&#xff0c;而 VR 消防技術的應用&#xff0c;為應急演練帶來了全新的體驗和更高的效率。VR 消防技術通過虛擬現實技術模擬逼真的火災場景&#xff0c;讓參與者能夠身臨其境地感受火災發生時的緊張氛圍。某知名物流企業&#xff0c;倉庫眾…

【電賽學習筆記】MaxiCAM 項目實踐——二維云臺追蹤指定目標

前言 本文是對視覺模塊MaixCam實現二維云臺人臉跟蹤_嗶哩嗶哩_bilibili大佬的項目實踐整理與拓展&#xff0c;侵權即刪。 單路舵機基本控制 #導入必要模塊 from maix import pwm, time , pinmap#定義全局變量&#xff0c;設初值 SERVO_FREQ 50 #主頻 SERVO_MIN_DUT…

深入解析 ArkUI 觸摸事件機制:從點擊到滑動的開發全流程

摘要 隨著 HarmonyOS NEXT 的不斷發展&#xff0c;ArkUI 逐漸成為主流的 UI 構建方式。而用戶交互在任何應用中都是基礎而又關鍵的一環&#xff0c;如何利用 ArkUI 提供的觸摸事件機制&#xff0c;如 onTouch、onClick、onSwipe 等&#xff0c;來實現自然、順滑、用戶友好的交互…

Tailwind CSS 自定義工具類與主題配置指南

一、自定義工具類配置在 src/tailwind.css 文件中&#xff0c;我們可以通過 layer utilities 指令添加自定義工具類&#xff1a;tailwind base; tailwind components; tailwind utilities;layer utilities {/* 自定義工具 上下浮動效果 */.animate-floatY {animation: floatY 3…

【代碼隨想錄二刷|704.二分查找、27.移除元素、977.有序數組的平方】

704.二分查找 題目鏈接&#xff1a;704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int search(vector<int>& nums, int target) {//不用二分查找&#xff0c;直接求// for(int i0;i<nums.size();i){// if(nums[i]target)…

基于Vue的工業設備大屏可視化模板(含設備地圖分布+宣傳模塊+報表展示+三維模型加載預覽)

場景 為實現工業設備可視化大屏需求&#xff0c;可實現基于地圖的設備數據管理&#xff0c;點擊具體設備可進行詳細介紹和三維模型展示。 可播放宣傳視頻&#xff0c;可展示PM數據報表等數據&#xff0c;可接受報警數據提醒、統計等數據。 基于現有開源平臺框架進行二次改造…

堆(Heap)優先級隊列(Priority Queue)

一、堆的概念堆&#xff08;Heap&#xff09;是一種特殊的基于樹的數據結構&#xff0c;通常分為最大堆和最小堆兩種類型。它滿足堆屬性&#xff1a;對于最大堆&#xff0c;父節點的值總是大于或等于其子節點的值&#xff1b;而對于最小堆&#xff0c;父節點的值總是小于或等于…

踩坑記錄:因版本不匹配導致 Boost 1.85 編譯失敗的完整解決過程

踩坑記錄&#xff1a;因版本不匹配導致 Boost 1.85 編譯失敗的完整解決過程 轉載請注明出處&#xff0c;歡迎評論區交流。 背景 最近在 Windows 11 VS2022 環境下嘗試用 b2 編譯 Boost 1.85.0&#xff0c;結果一路踩坑&#xff0c;最后發現罪魁禍首是 Boost.Build 自帶的 msv…

InfluxDB Line Protocol 協議深度剖析(二)

四、Line Protocol 寫入操作與實踐&#xff08;一&#xff09;HTTP API 寫入使用 HTTP API 是通過 Line Protocol 寫入數據到 InfluxDB 的常用方式。InfluxDB 1.x&#xff1a;請求方式為 POST&#xff0c;URL 格式為 “http://host:port/write?dbdatabase_name”。其中&#x…

負載均衡:提升業務性能的關鍵技術

一.負載均衡&#xff08;3.6 &#xff09;1.1.什么是負載均衡&#xff1a;負載均衡&#xff1a;Load Balance&#xff0c;簡稱LB&#xff0c;是一種服務或基于硬件設備等實現的高可用反向代理技術&#xff0c;負載均 衡將特定的業務(web服務、網絡流量等)分擔給指定的一個或多個…

【STM32項目】智能家居(版本1)

????大家好&#xff0c;這里是5132單片機畢設設計項目分享&#xff0c;今天給大家分享的是基于《基于STM32的智能家居設計》。 目錄 1、系統功能 2.1、硬件清單 2.2、功能介紹 2.3、控制模式 2、演示視頻和實物 3、系統設計框圖 4、軟件設計流程圖 5、原理圖 6、主…

OpenSCA開源社區每日安全漏洞及投毒情報資訊—2025年7月24日

2025年7月24日安全風險情報資訊在野漏洞風險&#xff08;CVE未收錄&#xff09;&#xff1a;1公開漏洞精選&#xff1a;2組件投毒情報&#xff1a;2在野漏洞風險&#xff08;CVE未收錄&#xff09;1.1 gemini-cli項目潛在命令注入漏洞項目詳情項目描述&#xff1a;gemini-cli是…