日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gsoap生成webservice调用客户端接口

發布時間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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调用客户端接口的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。