使用GSoap開發WebService客戶端與服務端


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類型,如果需要返回結果其它信息需要使用引用參數,
引用參數可以是基礎類型,或者自己封裝的結構體類型。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM