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顯示幫助信息。服務器
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。命令行
去掉編譯stdsoap2.cpp
文件設置的-DWITH_NONAMESPACES
宏定義 這個方法最簡單,但在multi-client and multi-server builds
模式下並不適合,由於這種模式下必須使用-DWITH_NONAMESPACES
宏定義,參見《9.1 soapcpp2 Options》
在soap對象初始化後用soap_set_namespaces
函數爲soap對象指定namespace。 這個方法也不復雜,只是添加一行代碼,前面的測試代碼修改以下:
https://blog.csdn.net/10km/article/details/52198306