Gsoap 編譯工具提供了一個SOAP/XML 關於C/C++ 語言的實現,
從而讓C/C++語言開發web服務或客戶端程序的工作變得輕松了很多。
用gsoap開發web service的大致思路
我們開發webservice應用,大致有兩個方向:
1. API接口固定,不關心底層的通訊,將SOAP作為應用層協議
此時,我們先定義接口,編寫好.h文件,運行soapcpp2生成出相應的代碼,對服務器端,修改XXXService文件,實現業務邏輯,對客戶端,修改XXXProxy文件,實現業務邏輯。
2. 通訊協議固定(當然需要基於XML的)或只有wsdl,將SOAP作為“傳輸層”協議
此時,我們必須根據通訊協議或wsdl生成相應的C/C++類型的.h文件,如果需要我們自己編寫wsdl,則需要一點其相關知識,不過我們可以用C#等生成一個簡單的wsdl,照貓畫虎即可。運用wsdl2h,我們可以生成.h文件,有了.h后,按上面的步驟繼續。
(注意:有時通過wsdl2 *.wsdl 命令生成的*.h頭文件會默認包含stlvector.h,所以編譯包里必須包含這個文件才能用soap2 *.h 命令編譯生成文件)
一、根據WSDL文件開發WebService客戶端,訪問Java的WebService服務端
1. Java 定義好WebService接口,生成WSDL標准接口文件。
2. 使用GSoap的WSDL2h.exe工具把WSDL文件生成C++的頭文件。
wsdl2h XXX.wsdl 命令會生成 XXX.h
3. 使用GSoap的 soapcpp2.exe工具把XXX.h頭文件生成Soap封裝的類。
soapcpp2 -C -p XXX -j XXX.h
-C為生成客戶端代碼,會生成以Proxy結尾的類,
-S為生成服務端代碼,會生成以Service結尾的類。
WSDL標准接口文件的解析說明可參考WSDL相關資料。
注意:根據WSDL文件生成的客戶端的接口返回值也是是int類型,返回結果被GSoap封裝為接口的引用參數了。
一、根據.h頭文件開發C++的WebService服務端,Java用客戶端訪問
1.定義APi接口函數
如:calc.h文件接口編寫
//calculater
//gsoap api service name: calc
//gsoap api service style: rpc
//gsoap api service encoding: encoded
//gsoap api service location: http://localhost:10086/
//gsoap api service namespace: http://basecode.soapapp
//gsoap api schema namespace: http://basecode.soapapp/message
typedef char* xsd__string;
typedef int xsd__int;
//加法接口
int api__add
(
xsd__int num1,
xsd__int num2,
xsd__string desc,
xsd__int & result
);
2.直接用build.bat腳本編譯成功后便會生成WS請求的WSDL接口文件。
使用soapcpp2命令編譯:
soapcpp2 -S -p calc -j calc.h 生產服務端代碼
3.編寫類繼承生成的接口類就可以實現其功能,
或者把用全局函數ns__add(int num1,int num2,string desc, int result)實現接口功能。
4.包含文件:頭文件,命名空間文件,soap組件文件
#include "soap/calcH.h"
#include "soap/calc.nsmap"
#include "soap/stdsoap2.h"
5.問題:其自定義生成接口在生成類中沒有添加實現,編譯報鏈接錯誤?
生成類源文件中實現自定義的接口函數,放空,編譯通過。
6.測試:使用SoapUi工具建立工程,加載到WSDl文件,其端口號要與監聽的端口一致。
注意:服務端的接口返回值必須是int類型,如果需要返回結果其它信息需要使用引用參數,
引用參數可以是基礎類型,或者自己封裝的結構體類型。