C++调⽤WebService的实现
前⾔:因为我们是Qt集成开发平台,⼀开始使⽤的是QGsoap。
QtSoap下载地址:
⽽且QtSoap 近⼗年也没⼈在维护了,但是其中有个严重的问题是不⽀持https的WebService的调⽤。
⽬标:gSoap实现C++调⽤⽀持ssl的WebService服务接⼝。因为⾃带的并不⽀持ssl。
编译机器:windows7 x64, Visual Studio 2015
gSOAP简介
gSOAP是⼀个开发SOAP和XML应⽤(它们组成了webservice)的⼯具,在英⽂中叫toolkit。它是跨平台的,webservice的客户端和服务器端,都可以⽤它来辅助开发。它主要的功能(特征)如下:
C/C++数据绑定⼯具,⽀持XML-RPCfrom/to JSON from/to C/C++ serialization
⽀持WSDL 1.1,2.0, SOAP 1.1, 1.2
⽀持REST HTTP(S) 1.0/1.1 operations (GET,PUT,POST etc) for XML, JSON,etc
⽀持MIME and MTOM 附件
⽀持IPv4,IPv6, TCP 和UDP
⽀持CGI,FastCGI
⽀持嵌⼊到Apache,IIS中发布
⾃带了⼀个Web server (multithreaded, SSL, compression)⽤于发布
可适⽤于WinCE, Palm, Symbian, VxWorks, Andriod, iPhone等⼩设备
gsoap下载地址:
下载开源:最近⼀次的Release的版本( 2021-07-09),现在好像是最新的是2.8.117了,不过没所谓,使⽤⽅式都是⼀样的。
下载OpenSSL:因为gsoap2.8如果要⽀持ssl编译的话,需要引⼊OpenSSL3.0,故先去下载安装OpenSSL3.0。
下载地址:,下载下来后,直接双击安装即可
解压⽂件夹后,到gsoap-2.8\gsoap\VisualStudio2005\wsdl2h⼯程,直接利⽤vs2015打开⼯程,会有⼀个⼯程转换,直接确定下⼀步即可。
1. wsdl2h属性页 - C/C++-预处理器:添加  WITH_OPENSSL 宏。
2. wsdl2h属性页 - VC++⽬录 - 包含⽬录:添加 D:\Program Files (x86)\OpenSSL-Win32\include
wsdl2h属性页 - VC++⽬录 - 库⽬录:添加 D:\Program Files (x86)\OpenSSL-Win32、D:\Program Files (x86)\OpenSSL-Win32\lib
3. wsdl2h属性页 - 连接器 - 输⼊:添加 libcrypto.lib;libssl.lib
4. 将“gsoap-2.8\gsoap\plugin”⽬录下的 httpda.c、httpda.h、smdevp.c、smdevp.h、threads.c、threads.h拷贝到“D:\gsoap-
2.8\gsoap\VisualStudio2005\wsdl2h\wsdl2h”⽬录下,并将此6个⽂件加⼊⼯程。
属性页的debug|release⾃⼰配置好了,配置的内容都是⼀样的。
在 gsoap-2.8\gsoap\VisualStudio2005\wsdl2h的⽬录下会⽣成debug和release两个⽬录,是存放⽣成的⽂件的。
wsdl2h⽀持ssl的编译内容结束。
下⾯是使⽤⽅式:
1. wsdl2h  -o WeatherWebService.h -N vis -t typemap_wchar.dat www.webxml/WebServices/WeatherWebService.asmx? wsdl
2. soapcpp2 -C -L -i -x WeatherWebService.h -I 解压的路径/gsoap-2.8/gsoap/import
上⾯的 typemap_wchar.dat ,是为了解决返回中⽂乱码问题。在原有的typemap.dat上添加了 xsd__string = | std::wstring | wchar_t*    # 注释符号为#
那么SOAP/XML中的string将转换成std::wstring或wchar_t*,这样能更好地⽀持中⽂。
gsoap中⽂乱码及内存清理等问题的解决⽅案:
⽣成下列⽂件:
写DEMO调⽤:使⽤的是Qt Creator,Qt 5.8.0 MSVC2015。
pro:
DEFINES += QT_DEPRECATED_WARNINGS WITH_OPENSSL
# 添加Soap库
INCLUDEPATH += $$PWD \
"D:/Program Files (x86)/OpenSSL-Win32/include" \
"D:/Program Files (x86)/OpenSSL-Win32/lib" \
win32:CONFIG(release, debug|release): {service fault
LIBS += -L$$PWD -llibssl
LIBS += -L$$PWD -llibcrypto
}
else:win32:CONFIG(debug, debug|release): {
LIBS += -L$$PWD -llibcrypto
LIBS += -L$$PWD -llibssl
}
将libcrypto.lib、libssl.lib、libcrypto-3.dll、libssl-3.dll 四个⽂件拷贝到demo⼯程⽬录下,并将上门⽣成的⽂件添加到demo⼯程⾥。
实现代码:
soap soap;
soap_set_mode(&soap, SOAP_C_UTFSTRING);
soap_ssl_init();
soap_init(&soap);
if ( soap_ssl_client_context(&soap, SOAP_SSL_NO_AUTHENTICATION, NULL, NULL, NULL, NULL, NULL ))
{
soap_print_fault(&soap, stderr);
}
soap.send_timeout = v_timeout = 10;    /* max I/O idle time is 10 seconds */
portalSoapProxy service(soap);
_ns__接⼝ request;
_ns__接⼝Response response;
int ret = service.接⼝(&request, response);
QString error = QString::fromLocal8Bit(service.soap_fault_string());
QString result = QString::fromWCharArray(response.GetDepartmentResult);
ui->teditResponse->clear();
ui->teditResponse->append(result);
//销毁、退出
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
结束。
以下是接触时都到先关⽐较好的介绍,供参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。