c++ - GET 请求的 TLS 初始化失败

标签 c++ json qt

我从 qt/c++ 开始,在我的项目中我需要制作一个 json post/get/put 但我正在尝试做一个简单的 get 请求但我有一个错误:qt.network。 ssl: QSslSocket::connectToHostEncrypted: TLS 初始化失败

我不知道为什么,我尝试了一些方法,但都放了同样的信息。我附上我使用的代码。

主窗口.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);
}

主窗口.h:

#include <QtCore>
#include <QNetworkAccessManager>
#include <QNetworkReply>

最佳答案

在 Windows 上,如果您通过在线安装程序安装 Qt,则可以选择 OpenSSL Toolkit 作为可选组件。这应该为您提供与您的 Qt 完全兼容的版本。

如果安装时没有勾选,可以重新运行C:\Qt\MaintenanceTool.exe,选择Add or remove components。 OpenSSL Toolkit 位于 Developer and Designer Tools 部分下,它是最后一个条目。

但是,边栏中有一条注释:

Qt installer doesn't set up OpenSSL environment. User needs to define the path and environment variables.

因此一旦安装,您应该将包含 DLL 的目录添加到 PATH 环境变量或将所需的 DLL 放在 .exe 文件附近(将它们复制到 debugrelease 项目的目录)。

该目录位于 C:\Qt\Tools\OpenSSL\Win_x64\bin(如果需要 32 位版本,则为 Win_x86)。在我的例子中,DLL 被命名为 libssl-1_1-x64.dlllibcrypto-1_1-x64.dll


但这还不足以将它部署到另一台机器上,在全部复制之后我又遇到了同样的错误。原因是 OpenSSL DLL 依赖于另一个 MSVC 运行时版本而不是 Qt 应用程序本身,并且这些错误没有被报告。在 Dependency Walker 中打开这些 DLL找出缺少的东西。在我的例子中是 MSVCR100.dll,所以我必须安装 MSVC 2010 Redistributable x64 (x86 is here)。

关于c++ - GET 请求的 TLS 初始化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53805704/

相关文章:

c++ - 从 C++ 代码运行/Shell/Fork 程序 + 从基本类型构造字符串

c++ - QAbstractListModel 在 MapIteMVieW 中委托(delegate)

python - 使用 PySerial 从串口读取二进制数据

android - 为 ARM 和 x86 构建 Qt

c++ - "multiple definitions"报错

c++ - 为什么 clang 编译器标志的顺序会影响生成的二进制大小?

c++ - 如果我在转换中丢失数据,我可以在 C++ 中引发异常吗?

java - Gson:如何跳过特定字段

java - Android Json解析为Arraylist

javascript - JSON解析: Uncaught SyntaxError: Unexpected token e