使用Gsoap創建webservice(c++)
使用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++)