QT HTTP通信--学习笔记2

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 就是需要移动的文件

详细的可以看这个两个文章

解决 QT 发送 HTTP 请求时遇到 qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed 问题-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_44916154/article/details/123362461?spm=1001.2014.3001.5506

Qt 解决qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed问题-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/WHEgqing/article/details/129836181?spm=1001.2014.3001.5506

很详细,照着做就行了,其中提到的两个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的通信可以看一下我以前做的一个笔记:

QT HTTP通信--学习笔记1-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Blasit/article/details/136880606?spm=1001.2014.3001.5502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值