1.前言
这两天查询emoji表情时找到一个网站,其中一个模块是emoji表情和成语的对照表,但是没有搜索功能,打开网页开发工具看了一下源码,对照表就在HTML源数据里面,而只要发Get请求就可以得到这个HTML源数据,想到之前学了一点HTTP的编程,遂决定自己写一个简易的小程序来查询这个emoji表情,然后就发现这个网站它只能进行HTTPS请求哇,发现我的QT环境不支持,上网查了一下,这样可以输出支持的通讯协议:
// 创建网络访问管理器
QNetworkAccessManager manager;
qDebug()<<manager.supportedSchemes();//查看管理器支持的通信方案
结果就是没有包含https,如果支持的话就输出("ftp", "file", "qrc", "http", "https", "data")。问题就来了,如何让QT环境支持HTTPS通讯?
2.解决https通讯不支持问题
2.1 查看是否支持SSL协议以及版本
首先,我们来看HTTP和HTTPS协议的区别,就是多个了SSL加密,呐,现在问题明确,只要加入SSL加密协议就行了,首先,我们先看看自己的QT环境是否支持SSL协议,以及支持哪一个版本,运行下面的代码:
// 查看是否支持SSL协议以及版本
qDebug()<<QSslSocket::supportsSsl();
qDebug()<<QSslSocket::sslLibraryBuildVersionString();
//输出:
//true
//"OpenSSL 1.1.1d 10 Sep 2019"
这就是我的,支持且支持这个版本,我的QT版本是:5.14.2。如果你的QT也和我的一样那应该也是这样输出。
2.2 安装SSL
简单来说就是
1、下载对应的SSL版本安装(注意要选The OpenSSL binaries(/bin) directory)
2、libcrypto-1_1-x64.dll、libssl-1_1-x64.dll 就是需要移动的文件
详细的可以看这个两个文章
很详细,照着做就行了,其中提到的两个DLL静态链接文件,我是放在QtCreator\bin目录中,按理来说这样就行了,不行就两个路径都添加吧,记得重新编译你的项目。打包的时候会不会自动添加在打包目录中我还没有测试,如果没有的自动添加这个两个DLL文件的话你自己加就好了。
最后确认一下支持的情况包含"https"就结束了,不包含就恭喜你,说明问题复杂起来了,我也不会。
3.进行HTTPS通信
编写起来几乎和HTTP一模一样,这里就举一个例子,封装一个get请求函数:
QByteArray getHttpRequestAndExec(QUrl url)
{
QNetworkAccessManager managerTemp;
QNetworkRequest request(url);
QNetworkReply *reply = managerTemp.get(request);// 执行GET请求
// 创建事件循环,等待请求完成
QEventLoop loop;
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
QByteArray responseData;
// 检查请求是否成功
if (reply->error() == QNetworkReply::NoError) {
// 读取请求结果
responseData = reply->readAll();
qDebug()<< "已向" << url.toString() << "请求完成";
} else {
// 处理错误
qDebug() << "HTTP GET请求"<< url.toString() <<"失败:" << reply->errorString();
}
// 释放资源
reply->deleteLater();
return responseData;
}
必要的注释我都加上了,传入的url是请求地址,直接调用就行。
http的通信可以看一下我以前做的一个笔记: