1. 程式人生 > >使用Gsoap創建webservice(c++)

使用Gsoap創建webservice(c++)

main 動態 spl har c代碼 esc war odin 信息

使用Gsoap創建WebService

(c++)

1. 下載編譯Gsoap

gSOAP工具包是用於SOAP和REST XML Web服務以及通用C / C ++ XML數據綁定的C和C ++軟件開發工具包。 該工具包分析WSDL和XML模式(單獨或作為組合集),並將XML模式類型和SOAP / REST XML消息傳遞協議映射為易於使用且高效的C和C ++代碼。 它還支持通過自動生成XML序列化代碼和WSDL規範將(傳統)C和C ++應用程序作為XML Web服務公開。

下載Gsoap2.8:Gsoap下載地址:https://sourceforge.net/projects/gsoap2/files

解壓,編譯,安裝後,

解壓目錄/gsoap/目錄下,找到stdsoap2.c,stdsoap2.cpp,stdsoap2.h三個文件,後續需要引入。

2. 編寫webservice所需頭文件

2.1 編寫imageRg.h文件,實例如下:(標註區域都需要根據實際情況替換)

//gsoap ns service name: imageRg

//gsoap ns service namespace: http://localhost/imageRg.wsdl

//gsoap ns service location: http://localhost

//gsoap ns service executable: imageRg.cgi

//gsoap ns service encoding: encoded

//gsoap ns schema namespace: urn:imageRg

int ns__getPlateID(std::string imgdata, std::string &plateID);

2.2 根據gosap工具生成源文件

Soapcpp2是一個根據.h文件生成若幹支持webservice的代碼生成工具,生成的代碼文件包括webservice客戶端和服務器的實現框架,XML數據綁定等,具體說明如下:

文件

描述

soapStub.h

根據輸入的.h文件生成的數據定義文件,一般我們不直接引用它。

soapH.h

soapC.cpp

客戶端和服務器端應包含該頭文件,它包含了soapStub.h。針對soapStub.h中的數據類型,cpp文件實現了序列化、反序列化方法。

soapXYZProxy.h

soapXYZProxy.cpp

這兩個文件用於客戶端,是客戶端調用webservice的框架文件,我們的代碼主要在此實現或從它繼承。

soapXYZService.h

soapXYZService.cpp

這兩個文件用於服務器端,是服務器端實現webservice的框架文件,我們的代碼主要在此實現或從它繼承。

.xsd

傳輸消息的schema,,我們可以看看是否滿足我們的協議格式(如果有此要求)

.wsdl

這個就不用說了。

.xml

滿足webservice定義的例子message,即實際的傳輸消息,我們可以看看是否滿足我們的協議格式(如果有此要求)。

.nsmap

命名空間的定義,對命名空間不敏感的,不用關註。

使用soapcpp2時,可選項如下:

選項

描述

-1

Soap1.1綁定

-2

SOAP1.2綁定

-C

只生成客戶端代碼

-S

只生成服務器端代碼

-T

生成自動測試代碼

-L

不生成 soapClientLib/soapServerLib

-a

用 SOAPAction 和WS-Addressing調用服務器端方法

-A

用 SOAPAction 調用服務器端方法

-b

采用char[N]這樣的方式來表示string

-c

生成的是C代碼,不是C++代碼

-d < path >

將代碼生成在 < path >下

-e

生成 SOAP RPC 樣式的綁定

-f N

File split of N XML serializer implementations per file

-h

顯示一個簡要的用法信息

-i

生成的服務代理類和對象從struct soap繼承而來

-j

生成的服務代理類和對象包含struct soap而來(C代碼的唯一選擇)

-I < path >

包含其他文件時使用,指明 < path > (多個的話,用`:‘分割),相當於#import ,該路徑一般是gSOAP目錄下的import目錄,該目錄下有一堆文件供soapcpp2生成代碼時使用。

-n

用於生成支持多個客戶端和服務器端(具體內容參考gSOAP文檔)

-p < name >

生成的文件前綴采用< name > ,而不是缺省的 "soap"

-q < name >

C++代碼中,所有聲明的命名空間

-s

生成的代碼在反序列化時,嚴格檢查XML的有效性

-t

生成的代碼在發送消息時,采用xsi:type方式

-u

在 WSDL/schema 輸出文件中不產生XML註釋

-v

顯示版本信息

-w

不生成 WSDL 和 schema 文件

-x

不生成 XML 形式的傳輸消息文件

-y

在XML 形式的傳輸消息文件中,包含 C/C++類型信息

實例:

在頭文件所在目錄執行:

root@worker:/opt/workspace/gsoap_headfiles/test# soapcpp2 -S -j -T driverMonitorSoap.h

** The gSOAP code generator for C and C++, soapcpp2 release 2.8.70

** Copyright (C) 2000-2018, Robert van Engelen, Genivia Inc.

** All Rights Reserved. This product is provided "as is", without any warranty.

** The soapcpp2 tool and its generated software are released under the GPL.

** ----------------------------------------------------------------------------

** A commercial use license is available from Genivia Inc., [email protected]

** ----------------------------------------------------------------------------

Saving soapStub.h annotated copy of the source interface file

Saving soapH.h serialization functions to #include in projects

driverMonitorSoap.h(9): *WARNING*: Cannot use document style with SOAP encoding

Using ns service name: driverMonitor

Using ns service style: document

Using ns service encoding: literal

Using ns service location: http://localhost

Using ns service executable: DriverMonitor.cgi

Using ns schema namespace: urn:DriverMonitor

Saving driverMonitor.wsdl Web Service description

Saving soapdriverMonitorService.h service class

Saving soapdriverMonitorService.cpp service class

Saving driverMonitor.dataStream.req.xml sample SOAP/XML request

Saving driverMonitor.dataStream.res.xml sample SOAP/XML response

Saving driverMonitor.getAlarmType.req.xml sample SOAP/XML request

Saving driverMonitor.getAlarmType.res.xml sample SOAP/XML response

Saving driverMonitor.nsmap namespace mapping table

Saving soapTester.cpp auto-test echo server

Saving ns.xsd XML schema

Saving soapC.cpp serialization functions

Compilation successful (1 warning)

root@worker:/opt/workspace/gsoap_headfiles/test# ll

total 216

drwxr-xr-x 2 root root 4096 3月 26 14:31 ./

drwxr-xr-x 6 root root 4096 3月 26 14:27 ../

-rw-r--r-- 1 root root 443 3月 26 14:31 driverMonitor.dataStream.req.xml

-rw-r--r-- 1 root root 461 3月 26 14:31 driverMonitor.dataStream.res.xml

-rw-r--r-- 1 root root 456 3月 26 14:31 driverMonitor.getAlarmType.req.xml

-rw-r--r-- 1 root root 460 3月 26 14:31 driverMonitor.getAlarmType.res.xml

-rw-r--r-- 1 root root 655 3月 26 14:31 driverMonitor.nsmap

-rw-r--r-- 1 root root 443 3月 26 14:31 driverMonitorSoap.h

-rw-r--r-- 1 root root 4442 3月 26 14:31 driverMonitor.wsdl

-rw-r--r-- 1 root root 1831 3月 26 14:31 ns.xsd

-rw-r--r-- 1 root root 78192 3月 26 14:31 soapC.cpp

-rw-r--r-- 1 root root 10476 3月 26 14:31 soapdriverMonitorService.cpp

-rw-r--r-- 1 root root 5613 3月 26 14:31 soapdriverMonitorService.h

-rw-r--r-- 1 root root 52952 3月 26 14:31 soapH.h

-rw-r--r-- 1 root root 14469 3月 26 14:31 soapStub.h

-rw-r--r-- 1 root root 1984 3月 26 14:31 soapTester.cpp

3. 添加生成的gsoap相關源碼到工程目錄

添加步驟2生成的源碼到工程目錄,項目不需要引入動態庫。

工程結構:

├── CMakeLists.txt

├── CMakeLists.txt.user

├── drivermonitorhandle.cpp

├── driverMonitor.wsdl

├── include

│ ├── base64vimg.h

│ ├── data.h

│ ├── driver_monitor.h

│ ├── drivermonitorhandle.h

│ ├── driverMonitor.nsmap

│ ├── driverMonitorSoap.h

│ ├── face_detection.h

│ ├── face_landmark.h

│ ├── glog

│ │ ├── …

│ ├── mylogger.h

│ ├── ns.xsd

│ ├── service.h

│ ├── soapH.h

│ ├── soapStub.h

│ ├── stb_image.h

│ ├── stdsoap2.h

│ └── systeminfo.h

├── lib

├── main.cpp

├── mylogger.cpp

├── service.cpp

├── soapC.cpp

├── soapServer.cpp

├── stdsoap2.cpp

└── systeminfo.cpp

最後添加請求處理邏輯到工程中。

使用Gsoap創建webservice(c++)