TLS对GET请求的初始化失败

ika*_*des 7 c++ qt json

我从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文件附近(将它们复制到项目的debugrelease目录)。

该目录位于C:\Qt\Tools\OpenSSL\Win_x64\bin(或者Win_x86如果您需要 32 位版本)。DLL 已命名libssl-1_1-x64.dlllibcrypto-1_1-x64.dll就我而言。


但这还不足以将其部署到另一台机器上,在将其全部复制后,我再次遇到相同的错误。原因是 OpenSSL DLL 依赖于另一个 MSVC 运行时版本而不是 Qt 应用程序本身,并且这些错误未被报告。在Dependency Walker 中打开这些 DLL以找出缺少的内容。就我而言,它是MSVCR100.dll,所以我必须安装MSVC 2010 Redistributable x64x86 在这里)。


use*_*329 8

找不到 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);以避免每次单击时出现内存泄漏。

  • 非常感谢!。我从 https://slproweb.com/products/Win32OpenSSL.html 安装了这个 **Win32 OpenSSL v1.0.2q Light** 并添加到我的 .pro 文件中:INCLUDEPATH += C:/OpenSSL-Win32/include (9认同)