尝试了多种办法,现在记录下来。
查看qt支持类型
#include <QDebug>
#include <QSslSocket>
#include <QNetworkAccessManager>
qDebug()<<QSslSocket::supportSsl()<<QSslSocket::sslLibraryBuildVersionString();
QNetorkAccessManager *manager = new QNetorkAccessManager;
qDebug()<<manager->supportedSchemes();
一开始当然是不支持的,给我打印的信息如下
false "OpenSSL 1.1.1d 10 sep 2019"
("ftp", "file", "qrc", "http", "data")
尝试以下办法
1、从 Qt5.14.2\Tools\mingw730_64\opt\bin\ 复制 libeay32.dll 、ssleay32.dll 到Qt5.14.2\5.14.2\mingw730_64\bin\ 。
2、从 Qt5.14.2\Tools\QtCreator\bin\ 复制 libssl-1_1.dll、libcrypto-1_1.dll到Qt\Qt5.14.2\5.14.2\mingw730_64\bin\。
3、最后,还是重装openssl,由于我的qt是mingw64,在下载地址选择对应的Win64 OpenSSL v1.1.1L Light(轻量版)的exe。安装后,将文件夹中的libssl-1_1-x64.dll libcrypto-1_1-x64.dll放到C:Qt\Qt5.14.2\5.14.2\mingw730_64\bin\下,这次可以有效支持https访问。
使用QNetworkAccessManager访问时需要设置QNetworkRequest的SSLConfiguration,以下以Network.cpp文件举例,能够对https进行post请求,请求内容data为json格式,请求结果由自定义槽函数slotRead读取。编译成release版本时需要在windeployqt后自行引入对应编译版本的dll,5.8版本以前通过前两种办法,不行就尝试openssl。
Network.cpp:
//url
QUrl url("https://...your url...");
//network
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
manager->setNetworkAccessible(QNetworkAccessManager::Accessible);
//ssl
QNetworkRequest request;
QSslConfiguration config = request.sslConfiguration();
config.setProtocol(QSsl::TlsV1_0); //选择对应Ssl版本参数
request.setSslConfigurtaion(config);
//request
request.setUrl(url);
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
QNetworkReply *ptrReply = manager->post(request, data);
connect(ptrReply, &QIODevice::readyRead, this, &Network::slotRead);
connect(ptrReply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(slotError(QNetworkReply::NetworkError)));
5.12版本以前使用qt下自带的libeay32.dll和ssleay32.dll就行,但我发现有两套对应的dll文件,经过测试在mingw下的那一套都可以运行。