gsoap生成webservice調用客戶端接口

1.下載gsoap2.8css

2.運行web

wsdl2h.exe -o XXX.h XXX.wsdl

wsdl文件能夠是本地文件,也能夠是服務器的wsdl,好比http://192.168.0.122:3333/ws/uss?wsdlswift

 

3.生成客戶端代碼服務器

 

soapcpp2.exe -L -x -C XXX.h -I .\gsoap-2.8\gsoap\import

 

4.若是有多個服務,那麼就將要使用命名空間spa

 

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,對照着很容易看出不一樣,把命名空間,類聲明等合在一塊兒就好了.net

 

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


拷貝gsoap2.8目錄下的stdsoap2.h,stdsoap2.cpp到程序目錄,並修改stdsoap2.cpp文件,將其中一個.nsmap文件包含進去code

#include "xxx.nsmap"

 

5.傳輸中文xml

調用方法轉爲utf-8傳輸soap_set_mode( soap*, SOAP_C_UTFSTRING )blog

若是用qt的QString將轉換dns

 

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());
}

 

 

例子

 

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文件

 

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這樣的

 

轉自:https://blog.csdn.net/johnnywww/article/details/8187398

相關文章
相關標籤/搜索