1. 程式人生 > >gsoap 在一個客戶端中呼叫多個service的解決方案

gsoap 在一個客戶端中呼叫多個service的解決方案

文件上關於這個的解決方案有兩種

1.使用wsdl2h將多個wsdl生成為一個wsdl.

2.使用-q指定C++名稱空間

方法1.沒有成功,而且還要解決一大堆的名稱空間問題

方法2.必須生成一個額外的沒有名稱空間的env,不然stdsoap2.cpp 編譯不過.而且使用env會出很多問題,比如soap_header會呼叫env檔案中的.而不會呼叫名稱空間中我們自己生成的service的相關方法

試個很久,最後找到個簡單的解決方法,對於要手動更改soap header來說,十分方便好用

先使用wsdl2h為不同的wsdl生成相關的檔案

wsdl2h -o aHeader.h -nan -NAS a.wsdl

wsdl2h -o bHeader.h -nbn -NBS a.wsdl

注:-n 和 -N是必須的,這樣才能替換掉預設的ns_等名稱空間字首

手動將兩個檔案的內容合在一個檔案中,對照著很容易看出不同,把名稱空間,類宣告等合在一起就行了

最後使用soapcpp2自動生成程式碼

soapcpp2 -CLx -pAll all.h -I ../../import

這樣就解決了

關於soapheader 可以自己在合好的.H檔案裡更改。soapcpp2生成程式碼時會自動完成相關工作,不用像網上說的更改soap_out_SAOP_ENV_Header等方法,但注意命名規則

比如

SOAP_ENV_Header

{

   char* an__Username;

}

 an__是在soap頭中指定Username的名稱空間

而an可以手工新增在wsdl2h生成的檔案中,開啟看一下應該就能很好的明白了

注意

在all.h裡新增額外的名稱空間時,應新增在尾部,不然會出現名稱空間不匹配的錯誤

在生成的xxxProxy.h中 建構函式裡 將其他service的名稱空間去掉

SOAP_ENV_Header中節點如果是包含關係,需要定義成結構,而且不要繼承xsd_anyType

比如

<as:GetName><UserName>test</UserName><Password>123455</Password></a:getName>

定義為

class GetName /*piblic:xsd_anyType*/

{

        std::string* UserName;

        std::string* Password;

}

SOAP_ENV_Header

{

          GetName* as__GetName;

}