我从qt / c ++开始,在我的项目中,我需要进行json post / get / put操作,但是我试图做一个简单的get请求,但出现错误: qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
我不知道为什么,我尝试了一些方法,但是都发出了相同的消息。我附上我使用的代码。
mainwindow.cpp:
void MainWindow::replyFini(QNetworkReply* reply)
{
QString answer = QString::fromUtf8(reply->readAll());
qDebug() << "answer------------>"<<answer;
}
void MainWindow::on_btn_login_clicked()
{
QNetworkRequest request(QUrl("https://httpbin.org/get"));
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFini(QNetworkReply*)));
manager->get(request);
}
Run Code Online (Sandbox Code Playgroud)
mainwindow.h:
#include <QtCore>
#include <QNetworkAccessManager>
#include <QNetworkReply>
Run Code Online (Sandbox Code Playgroud)
use*_*ser 21
在 Windows 上,如果您通过在线安装程序安装 Qt,则可以选择 OpenSSL Toolkit 作为可选组件。这应该为您提供与您的 Qt 绝对兼容的版本。
如果您在安装过程中没有勾选它,您可以重新运行C:\Qt\MaintenanceTool.exe并选择添加或删除组件。OpenSSL Toolkit 位于 Developer and Designer Tools 部分下,它是最后一个条目。
但是,侧边栏中有一个注释:
Qt 安装程序不设置 OpenSSL 环境。用户需要定义路径和环境变量。
因此,一旦安装,您应该将包含 DLL 的目录添加到 PATH 环境变量或将所需的 DLL 放在.exe文件附近(将它们复制到项目的debug和release目录)。
该目录位于C:\Qt\Tools\OpenSSL\Win_x64\bin(或者Win_x86如果您需要 32 位版本)。DLL 已命名libssl-1_1-x64.dll,libcrypto-1_1-x64.dll就我而言。
但这还不足以将其部署到另一台机器上,在将其全部复制后,我再次遇到相同的错误。原因是 OpenSSL DLL 依赖于另一个 MSVC 运行时版本而不是 Qt 应用程序本身,并且这些错误未被报告。在Dependency Walker 中打开这些 DLL以找出缺少的内容。就我而言,它是MSVCR100.dll,所以我必须安装MSVC 2010 Redistributable x64(x86 在这里)。
找不到 SSL 库。错误可以在Qt Src 中读出。将它们与您的应用程序一起部署或在您的机器上安装 OpenSSL。
另外,只是一个小提示:
void MainWindow::replyFini(QNetworkReply* reply)
{
QString answer = QString::fromUtf8(reply->readAll());
qDebug() << "answer------------>"<<answer;
}
Run Code Online (Sandbox Code Playgroud)
你应该打电话 reply->deleteLater();
void MainWindow::on_btn_login_clicked()
{
QNetworkRequest request(QUrl("https://httpbin.org/get"));
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFini(QNetworkReply*)));
manager->get(request);
}
Run Code Online (Sandbox Code Playgroud)
添加connect(manager, &QNetworkAccessManager::finished, manager, &QNetworkAccessManager::deleteLater);以避免每次单击时出现内存泄漏。