C++客戶端訪問Java服務端發佈的SOAP模式的WebService接口

gSOAP是一個綁定SOAP/XML到C/C++語言的工具,使用它能夠 簡單快速地開發出SOAP/XML的服務器端和客戶端html

Step1 使用gsoap-2.8\gsoap\bin\win32\wsdl2h.exe生成客戶端頭文件。web

執行該命令行,在wsdl2h.exe同目錄下生成hellowebservice.h頭文件。生成C++版本,不使用STL的頭文件。wsdl2h.exe命令還有不少參數可選,wsdl2h.exe  –h顯示幫助信息。服務器

Step2 使用gsoap-2.8\gsoap\bin\win32\ soapcpp2.exe生成樁文件。藉助這些樁函數,在C++中能夠像調用本地函數同樣訪問遠程服務器上的WebService服務。

Soapcpp2.exe還有不少參數可選,輸入 soapcpp2.exe –h可查看幫助。執行上述命令後生成的以下文件(將紅框內的文件拷貝到VS2010工程中):函數

可是運行完畢後獲得的結果爲NULL。工具

貌似是由於soap.namespaces變量爲NULL形成的,再運行程序證明了這個猜想,soap.namespaces果真爲NULL; 因而嘗試在soap對象建立後,添加以下代碼,問題解決。測試

if(!soap->namespaces) soap->namespaces=namespaces; // namespaces變量定義在#include "FaceDbServiceSoap11Binding.nsmap"

解決方案

雖然這樣解決了問題,但仍是不知道爲何呀,網上其餘的教程中沒有提到要手工設置soap.namespaces變量呀。 因而想到跟蹤soap對象的代碼,看看namespaces變量是怎麼被初始化的。找到了這裏(soap_versioning(soap_init)(struct soap *soap, soap_mode imode, soap_mode omode)函數中),看到這裏瞬間明白了。:ui

由於我在用gsoapcpp2生成gosap C++客戶端代碼的時候使用了-DWITH_NONAMESPACES編譯stdsoap2.cpp文件,因此這裏初始化soap對象時就將namespaces指針賦值爲NULL。spa

若是使用了-DWITH_NONAMESPACES定義,就必須顯式的使用soap_set_namespaces爲soap對象指定namespace。.net

到此,問題基本算是搞清楚了,致使soap請求數據格式錯誤的直接緣由是soap初始化時沒有指定namespace命令行

解決方案1

去掉編譯stdsoap2.cpp文件設置的-DWITH_NONAMESPACES宏定義 這個方法最簡單,但在multi-client and multi-server builds模式下並不適合,由於這種模式下必須使用-DWITH_NONAMESPACES宏定義,參見《9.1  soapcpp2 Options》

解決方案2

在soap對象初始化後用soap_set_namespaces函數爲soap對象指定namespace。 這個方法也不復雜,只是添加一行代碼,前面的測試代碼修改以下:

https://blog.csdn.net/10km/article/details/52198306

https://blog.csdn.net/ylforever/article/details/44513171

https://blog.csdn.net/dongdan_002/article/details/46790879

相關文章
相關標籤/搜索