gSoap自定義介面檔案

2021-08-14 13:26:34 字數 3150 閱讀 1299

介面標頭檔案的格式在嚮導中沒有看到明確的說明性的內容,但通過看開發包中示例程式中標頭檔案定義和通過wsdl生成的標頭檔案的內容,可以發現,標頭檔案中都會出現以下幾行資訊

//gsoap ns service name: calc ****** calculator service

//gsoap ns service style: rpc

//gsoap ns service encoding: encoded

//gsoap ns service namespace: 

//gsoap ns service location: 

//gsoap ns  service method-style: add rpc

//gsoap ns  service method-encoding: add

//gsoap ns  service method-action: add 「」

這些都是標頭檔案中的說明性資訊,編譯時會用到這裡的資訊,這些資訊有命名空間的和服務名稱的名字,有些資訊為預設引數資訊,如service location 如果在客戶端呼叫介面方法時,沒有輸入服務端位址,方法執行時將自動呼叫此處的位址做為伺服器位址。後三行是對add方法的說明,在寫標頭檔案時可以修改一下這些說明資訊如下:

//gsoap ns service name: calc ****** calculator service

//gsoap ns service style: rpc

//gsoap ns service namespace: urn:calc

//gsoap ns service location: 

這些資訊是很重要的,如果是已定義好的介面,一定要注意命名空間名字統一。

下面開始主要工作:介面定義

gsoap對「_」和「__」(下劃線、雙下劃線)有特殊用法,介面定義時函式名前要加上命名空間名和雙下劃線

舉例:加法運算

int add(int num1, int num2, int &num3);

在介面標頭檔案定義時要寫成如下格式

int ns__add(int num1, int nmu2, int &num3);

其中 「ns」是命名空間名稱,此名稱可以自定義成其它名字 但其後」urn:calc」不可隨意更改,這個是要與服務端統一的

「__」是編譯時識別符號,如果沒有的話xml檔案是編譯不出來的

」_」(單下劃線)定義名稱中要慎用,自己定義的變數或函式名稱中使用下劃線的地方要在下劃線後加上」uscore」;

例 定義 ns__add_sum(int num_1, int num2, int &num_3);

要寫成如下形式

ns__add_uscoresum(int num_uscore1, int num2, int &num_uscore3);

」add」是介面函式名 這個是客戶端與伺服器統一的介面名字

函式內引數變數型別和變數名 為客戶端與伺服器統一的介面

函式中只有最後乙個引數是輸出引數,前面的都是輸入引數

若有多個輸出資訊,可定義結構體。

若沒有輸入引數 可將輸入引數型別定義為void *(將忽略void *型別的引數)

函式返回型別必須為 int,可以通過返回值判斷介面函式執**況

至此介面定義要注意的地方完畢,開始寫介面定義檔案。

本例中使用自定義的標頭檔案,編寫客戶端程式,但伺服器仍與上篇中伺服器相同,以便說明兩種方式的結果,介面可以從上篇中由wsdl生成的標頭檔案中獲得。

原始碼如下:

///gsoap ns service name: mycalc

//gsoap ns service style: rpc

//gsoap ns service namespace: urn:calc

//gsoap ns service location: 

int ns__add(double a, double b, double &result);

int ns__sub(double a, double b, double &result);

int ns__mul(double a, double b, double &result);

int ns__div(double a, double b, double &result);

int ns__pow(double a, double b, double &result);

/上面檔案中一定要注意 //gsoap ns service namespace: urn:calc 由於伺服器中介面命名空間為calc 故此處必須是calc!

開始編譯此標頭檔案

執行 soapcpp2.exe mycalc.h

編譯成功,寫客戶端程式

新建工程mycalcclient, 新增生成的檔案,新建原始檔mycalcclient.cpp

原始碼如下

const char server = 「「;

int main(int argc, char **argv)

soap_init(&soap);

a = strtod(argv[2], null);

b = strtod(argv[3], null);

switch (*argv[1])

if (soap.error)

else

printf(「result = %g\n」, result);

soap_destroy(&soap);

soap_end(&soap);

soap_done(&soap);

return 0;

}測試一下吧^_^

對比兩種生成介面標頭檔案的方法,選擇那一種還要視情況而定

如果是已有寫好的wsdl文件,當然是選擇用wsdl2h工具來生成標頭檔案了,畢竟這個方便的多,但在編譯時,一定要檢查警告資訊,有些情況下生成的介面頭件存在編譯異常,例如複雜資料結構時就有可能出現結構體命名不符合gsoap命名規則(實際應用中遇至過,此時要手動修改這些命名)

簡單說一下soap結構體初始化及清理

soap_init(&soap);//初始化

…………

soap_destroy(&soap);//結束清理操作

soap_end(&soap);

soap_done(&soap);

嚮導中這方面講的比較細^_^

gSoap使用入門(2) 自定義介面標頭檔案

介面標頭檔案的格式在嚮導中沒有看到明確的說明性的內容,但通過看開發包中示例程式中標頭檔案定義和通過wsdl生成的標頭檔案的內容,可以發現,標頭檔案中都會出現以下幾行資訊 gsoap ns service name calc calculator service gsoap ns service st...

自定義介面

好久沒寫介面了 好像以前也沒怎麼寫過.已經忘記怎麼寫了 就自己動手寫乙個熟悉一下 demo很簡單 就三個類 名字就隨便起了 public inte ce mylistener2 public class a catch interruptedexception e listener.setliste...

介面 顯示自定義視窗

製作自定義視窗類 存在的問題 製作的視窗不能移動 如果要改進,可以參見 無標題視窗的移動 this m pmainwnd new wnd this m pmainwnd showwindow this m ncmdshow this m pmainwnd updatewindow 注意一定要 ret...