qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
在qt上用QJson解析数据,遇到上面的错误,困扰了几天,最开始时上面的错误报好多类似的问题,反正后来随便捣鼓就变成了上面一个错误了。
- 首先说下我遇到错误后,也差了很多资料,很多人也只是说说将C:\QT\Tools\QtCreator\bin(前面的根据自己的qt安装路径, tools后不变的)文件下的libeay32.dll和ssleay32.dll 复制到…QT\5.12.3\mingw73_64\bin中去就行了,但是事实并不是万能的,我想也不是我的问题,也不是你的问题,也是你碰巧你的程序可以运行了。到这里我就各种排除错误,这里写下我的解决方案。
- 首先吧上面的做法先做一遍。不管有没有用,万一有用你就不用看下面了,直接开始你的解析数据就行了。
- 万一没用,这里我就推荐先查一下自己qt自带的ssl 的版本是多少。用下面的代码即可。
#include <QSslSocket>
#include "qdebug.h"
// 这个函数也要用对,我有次还用错了函数,弄了半天
qDebug()<< QSslSocket::sslLibraryBuildVersionString();
// 这里我的版本是这个 记住这个版本号
// "OpenSSL 1.0.2p 14 Aug 2018"
- 这里就用这个网站上下载对应的版本。这里千万不要追求使用最新版,我之前下载的就是最新版最上面的一个,然后我又没有查询上面的版本,所以苦恼了我一段时间。直接下载1.0.2版本即可。注意安装的时候点击bin目录下。
- 然后将C:\Program Files\OpenSSL-Win64\bin目录下的两个文件libcrypto-1_1-x64.dll 和libssl-1_1-x64.dll(1.0.2 版本对应下面的两个文件) 直接拷到E:\QT\5.12.3\mingw73_64\bin这里下,如果你用的mvsc的拷到对应的目录,这个应该懂的。
- 最后直接运行你的程序,你会发现没有烦恼了。
- 接下来就考试你的解析数据之旅了。解决问题了内心很快落~~~
总结:
- 有些方法可能通过其他人的示例,找到类似的解决方案,上面的解决方法差不多都是将两个文件拷贝到指定的文件夹下,但是可能由于版本的问题,一直折磨你,这时就要有前人之鉴,来解决自己的实际问题,毕竟不是每个人遇到的问题都是一样的,你自己总会要有一定的解决问题的能力。
- 我这里也是将我的实际遇到的问题记录下来,因为我遇到这个问题的同时,好像很多人没有版本问题,可能我的运气不好,安装的版本就是兼容,但是每条路都有解决方案的,要相信自己。
解析json数据
- 由于上面的代码是我在解析天气预报时遇到的,现在就拿这里做示例。
/// 原始的信息是这样子的。 下面的格式化,可以就到json在线解析
{"results":[{"location":{"id":"WT3Q0FW9ZJ3Q","name":"武汉","country":"CN","path":"武汉,武汉,湖北,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"多云","code":"4","temperature":"28"},"last_update":"2020-05-31T18:09:00+08:00"}]}
/// 解析好的格式清晰明了
{
"results":[
{
"location":{
"id":"WT3Q0FW9ZJ3Q",
"name":"武汉",
"country":"CN",
"path":"武汉,武汉,湖北,中国",
"timezone":"Asia/Shanghai",
"timezone_offset":"+08:00"
},
"now":{
"text":"多云",
"code":"4",
"temperature":"28"
},
"last_update":"2020-05-31T18:09:00+08:00"
}
]
}
- 写函数进行解析
void Widget::replyFinished(QNetworkReply *reply)
{
// qDebug() <<"recv weather data !!";
QString all = reply->readAll();
qDebug() << all;
ui->textBrowser->setText(all);
//{
//"results":[
// {
// "location":{
// "id":"WT3Q0FW9ZJ3Q",
// "name":"武汉",
// "country":"CN",
// "path":"武汉,武汉,湖北,中国",
// "timezone":"Asia/Shanghai",
// "timezone_offset":"+08:00"
// },
// "now":{
// "text":"多云",
// "code":"4",
// "temperature":"28"
// },
// "last_update":"2020-05-31T18:09:00+08:00"
// }
//]
//}
QJsonParseError err;
/// @brief 解析json对象
/// @param all是json信息
QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(), &err);
qDebug() << err.error;
if (!json_recv.isNull())
{
// qDebug() << "json obj success!";
QJsonObject root_obj = json_recv.object();
QJsonValue res_val = root_obj.value("results");
if(res_val.isArray())
{
QJsonObject res_obj = res_val.toArray().at(0).toObject();
/// @brief 解析location键的值
QJsonObject loc_obj = res_obj.value("location").toObject();
QString id = loc_obj.value("id").toString();
QString name = loc_obj.value("name").toString();
QString country = loc_obj.value("country").toString();
QString timezone = loc_obj.value("timezone").toString();
QString path = loc_obj.value("path").toString();
qDebug () << "location end!";
/// @brief 解析now
QJsonObject now_obj = res_obj.value("now").toObject();
QString text = now_obj.value("text").toString();
QString temperature = now_obj.value("temperature").toString();
qDebug() << "now end!";
QString last_update = res_obj.value("last_update").toString();
qDebug() << "update end!";
}
}
else
{
qDebug() << "json obj failed !";
}
reply->deleteLater();
}
- 解析信息如下
在这里就差不多已经好了!!!