微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

gsoap生成webservice调用客户端接口

http://www.voidcn.com/article/p-kkmpykwz-ky.html


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.8\gsoap\import  

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:\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这样的

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

    相关推荐