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;
}