生活随笔
收集整理的這篇文章主要介紹了
gsoap生成webservice调用客户端接口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.下載gsoap2.8
2.運行
[plain] view plaincopy
wsdl2h.exe?-o?XXX.h?XXX.wsdl??wsdl文件可以是本地文件,也可以是服務器的wsdl,比如http://192.168.0.122:3333/ws/uss?wsdl
3.生成客戶端代碼
[plain] view plaincopy
soapcpp2.exe??-L?-x?-C?XXX.h?-I?.\gsoap-2.8\gsoap\import??
4.如果有多個服務,那么就將要使用命名空間
[plain] view plaincopy
wsdl2h?-nns別名?-N服務命名空間?-o?XXX.h?XXX.wsdl??wsdl2h?-nuseraddns?-NUserAddWS?-oUserAddWebService.h?userAddWebService.wsdl??wsdl2h?-nuserloginns?-NUserLoginWS?-oUserLoginWebService.h?userLoginWebService.wsdl??
手動將生成的.h合并為一個新文件,比如上面兩個User*.h,合并為新文件all.h,
對照著很容易看出不同,把命名空間,類聲明等合在一起就行了[plain] view plaincopy
soap2cpp?-LCx?-pCMSWS?All.h?-I?../../import??
拷貝gsoap2.8目錄下的stdsoap2.h,stdsoap2.cpp到程序目錄,并修改stdsoap2.cpp文件,將其中一個.nsmap文件包含進去
[plain] view plaincopy
#include?"xxx.nsmap"??
5.傳輸中文
調用方法轉為utf-8傳輸soap_set_mode( soap*, SOAP_C_UTFSTRING )
如果用qt的QString將轉換
[cpp] view plaincopy
std::string?CUIUtils::convertQStrToUTF8Str(const?QString&?value)?{??????QByteArray?arr?=??value.toUtf8();??????return?std::string(arr.data());??}????QString?CUIUtils::convertUTF8StrToQStr(const?std::string&?value)?{??????return?QString::fromUtf8(value.c_str());??}??
例子
[cpp] view plaincopy
int?CUserDetailInfoWebServiceImpl::getUserInfo(const?char*?address,?CUserDetailInfo*?userDetailInfo)??{??????UserDetailInfoWebServiceCXFImplServiceSoapBinding?webServiceBinding;??????if?((NULL?!=?address)?&&?strlen(address)?>?0)??????{??????????webServiceBinding.endpoint?=?address;??????}??????soap_set_mode(webServiceBinding.soap,?SOAP_C_UTFSTRING);??????userDetailInfo->setRetCode(RET_CODE_ERROR_UNKNOWN);??????UserDetailInfoWS__getUserInfoByUserId?request;??????std::string?id?=?userDetailInfo->getUserId();??????request.userId?=?&id;??????UserDetailInfoWS__getUserInfoByUserIdResponse?response;??????int?ret?=?webServiceBinding.__UserDetailInfoWS__getUserInfoByUserId(&request,?&response);??????if?(SOAP_OK?==?ret)??????{??????????if?(NULL?==?response.result)??????????{??????????????userDetailInfo->setRetCode(RET_CODE_NULL_OBJECT);??????????????userDetailInfo->setErrorDesc("no?return?value");??????????????return?userDetailInfo->getRetCode();??????????}??????????userDetailInfo->setRetCode(response.result->retCode);??????????if?(RET_CODE_SUCCESS?!=?userDetailInfo->getRetCode())??????????{??????????????userDetailInfo->setErrorDesc(*response.result->desc);??????????}??????????else??????????{??????????????if?(NULL?==?response.result->userOperateInfo)??????????????{??????????????????userDetailInfo->setRetCode(RET_CODE_NULL_OBJECT);??????????????????userDetailInfo->setErrorDesc("no?return?info");??????????????????return?userDetailInfo->getRetCode();??????????????}??????????????userDetailInfo->setDescript(*response.result->userOperateInfo->descript);??????????????userDetailInfo->setDepartmentId(*response.result->userOperateInfo->departmentId);??????????????userDetailInfo->setEnabled(response.result->userOperateInfo->enable);??????????????userDetailInfo->setLoginName(*response.result->userOperateInfo->loginName);??????????????userDetailInfo->setPassword(*response.result->userOperateInfo->password);??????????????userDetailInfo->setUserName(*response.result->userOperateInfo->name);??????????}????????}??????else??????{??????????userDetailInfo->setRetCode(RET_CODE_SOAP_ERROR);??????????userDetailInfo->setDescript(*soap_faultstring(webServiceBinding.soap));??????}??????return?userDetailInfo->getRetCode();????}??
6.導入多個wsdl文件
[plain] view plaincopy
wsdl2h.exe?-sck?-t?e:\test\typemap.dat?-o?onvif.h?analytics.wsdl?analyticsdevice.wsdl?deviceio.wsdl?devicemgmt.wsdl?display.wsdl?event.wsdl?imaging.wsdl?media.wsdl?ptz.wsdl?Receiver.wsdl?Recording.wsdl?remotediscovery.wsdl?Replay.wsdl?Search.wsdl??
7.操作參數:
以下就是wsdl2h的選項:
-o 文件名,指定輸出頭文件
-n 名空間前綴 代替默認的ns
-c 產生純C代碼,否則是C++代碼
-s 不要使用STL代碼
-t 文件名,指定type map文件,默認為typemap.dat
-e 禁止為enum成員加上名空間前綴
type map文件用于指定SOAP/XML中的類型與C/C++之間的轉換規則,比如在wsmap.dat里寫
xsd__string = | std::wstring | wchar_t*
那么SOAP/XML中的string將轉換成std::wstring或wchar_t*,這樣能更好地支持中文。
接著就是講.h文件生成.cpp文件
soapcpp2.exe接的選項如下
-C 僅生成客戶端代碼
-S 僅生成服務器端代碼
-L 不要產生soapClientLib.c和soapServerLib.c文件
-c 產生純C代碼,否則是C++代碼(與頭文件有關)
-I 指定imp<wbr>ort路徑(見上文) </wbr>
-x 不要產生XML示例文件
-i 生成C++包裝,客戶端為xxxxProxy.h(.cpp),服務器端為xxxxService.h(.cpp)。
這里一般需要帶上-x,不然會生成一大堆的xml文件。
-i選項也要帶上,不然不會生成soapXXXXBindingService.cpp和soapXXXXBindingService.h文件
-I 選項一般也要帶上,-I 后接gsoap路徑中import目錄
一般是-I E:\workspace\onvif\gsoap-2.8\gsoap\import;E:\workspace\onvif\gsoap-2.8\gsoap這樣的
總結
以上是生活随笔為你收集整理的gsoap生成webservice调用客户端接口的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。