加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

gsoap生成webservice调用客户端接口

发布时间:2020-12-17 00:15:11 所属栏目:安全 来源:网络整理
导读:1.下载gsoap2.8 2.运行 [plain] ? view plain copy wsdl2h.exe?-o?XXX.h?XXX.wsdl?? wsdl文件可以是本地文件,也可以是服务器的wsdl,比如http://192.168.0.122:3333/ws/uss?wsdl 3.生成客户端代码 copy soapcpp2.exe??-L?-x?-C?XXX.h?-I?.gsoap-2.8gsoap

1.下载gsoap2.8

2.运行

[plain]? view plain copy
  1. wsdl2h.exe?-o?XXX.h?XXX.wsdl??
wsdl文件可以是本地文件,也可以是服务器的wsdl,比如http://192.168.0.122:3333/ws/uss?wsdl

3.生成客户端代码

copy
    soapcpp2.exe??-L?-x?-C?XXX.h?-I?.gsoap-2.8gsoapimport??

4.如果有多个服务,那么就将要使用命名空间

copy

    wsdl2h?-nns别名?-N服务命名空间?-o?XXX.h?XXX.wsdl??
  1. wsdl2h?-nuseraddns?-NUserAddWS?-oUserAddWebService.h?userAddWebService.wsdl??
  2. wsdl2h?-nuserloginns?-NUserLoginWS?-oUserLoginWebService.h?userLoginWebService.wsdl??


手动 将生成的.h合并为一个新文件,比如上面两个User*.h,合并为新文件all.h, 对照着很容易看出不同,把命名空间,类声明等合在一起就行了

copy

    soap2cpp?-LCx?-pCMSWS?All.h?-I?../../import??

拷贝gsoap2.8目录下的stdsoap2.h,stdsoap2.cpp到程序目录,并修改stdsoap2.cpp文件,将其中一个.nsmap文件包含进去
copy
    #include?"xxx.nsmap"??


5.传输中文

调用方法转为utf-8传输soap_set_mode( soap*,SOAP_C_UTFSTRING )

如果用qt的QString将转换

[cpp]? copy
    std::string?CUIUtils::convertQStrToUTF8Str(const?QString&?value)?{??
  1. ????QByteArray?arr?=??value.toUtf8();??
  2. ????return?std::string(arr.data());??
  3. }??
  4. ??
  5. QString?CUIUtils::convertUTF8StrToQStr(const?std::string&?value)?{??
  6. return?QString::fromUtf8(value.c_str());??
  7. }??

例子

copy
    int?CUserDetailInfoWebServiceImpl::getUserInfo(const?char*?address,?CUserDetailInfo*?userDetailInfo)??
  1. {??
  2. ????UserDetailInfoWebServiceCXFImplServiceSoapBinding?webServiceBinding;??
  3. ????if?((NULL?!=?address)?&&?strlen(address)?>?0)??
  4. ????{??
  5. ????????webServiceBinding.endpoint?=?address;??
  6. ????}??
  7. ????soap_set_mode(webServiceBinding.soap,?SOAP_C_UTFSTRING);??
  8. ????userDetailInfo->setRetCode(RET_CODE_ERROR_UNKNOWN);??
  9. ????UserDetailInfoWS__getUserInfoByUserId?request;??
  10. ????std::string?id?=?userDetailInfo->getUserId();??
  11. ????request.userId?=?&id;??
  12. ????UserDetailInfoWS__getUserInfoByUserIdResponse?response;??
  13. ????int?ret?=?webServiceBinding.__UserDetailInfoWS__getUserInfoByUserId(&request,?&response);??
  14. if?(SOAP_OK?==?ret)??
  15. ????{??
  16. ????????if?(NULL?==?response.result)??
  17. ????????{??
  18. ????????????userDetailInfo->setRetCode(RET_CODE_NULL_OBJECT);??
  19. ????????????userDetailInfo->setErrorDesc("no?return?value");??
  20. ????????????return?userDetailInfo->getRetCode();??
  21. ????????}??
  22. ????????userDetailInfo->setRetCode(response.result->retCode);??
  23. ????????if?(RET_CODE_SUCCESS?!=?userDetailInfo->getRetCode())??
  24. ????????{??
  25. ????????????userDetailInfo->setErrorDesc(*response.result->desc);??
  26. ????????}??
  27. else??
  28. ????????????if?(NULL?==?response.result->userOperateInfo)??
  29. ????????????{??
  30. ????????????????userDetailInfo->setRetCode(RET_CODE_NULL_OBJECT);??
  31. ????????????????userDetailInfo->setErrorDesc("no?return?info");??
  32. ????????????????return?userDetailInfo->getRetCode();??
  33. ????????????}??
  34. ????????????userDetailInfo->setDescript(*response.result->userOperateInfo->descript);??
  35. ????????????userDetailInfo->setDepartmentId(*response.result->userOperateInfo->departmentId);??
  36. ????????????userDetailInfo->setEnabled(response.result->userOperateInfo->enable);??
  37. ????????????userDetailInfo->setLoginName(*response.result->userOperateInfo->loginName);??
  38. ????????????userDetailInfo->setPassword(*response.result->userOperateInfo->password);??
  39. ????????????userDetailInfo->setUserName(*response.result->userOperateInfo->name);??
  40. ????}??
  41. else??
  42. ????????userDetailInfo->setRetCode(RET_CODE_SOAP_ERROR);??
  43. ????????userDetailInfo->setDescript(*soap_faultstring(webServiceBinding.soap));??
  44. 6.导入多个wsdl文件

    copy

      wsdl2h.exe?-sck?-t?e:testtypemap.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:workspaceonvifgsoap-2.8gsoapimport;E:workspaceonvifgsoap-2.8gsoap这样的

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读