存在以下类型的问题。有一个应用程序可以发出 post 和 get 请求,一切正常,但仅使用 http,但如果请求通过 https,则 Qt 抛出错误 qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS 初始化失败。谷歌搜索问题后,我发现可能没有 SSL 库,因此问题是,我在哪里可以得到这个东西以及如何将它连接到项目?我将不胜感激任何提示,以防我附上我的代码
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString A, B, C, X, Z;
QByteArray data= "{ \"Authorization\":\"Bearer AQAAAAAGX9TiAATuwa8z\" }";
A=ui->lineEdit->text(); //широта
B=ui->lineEdit_2->text(); //долгота
C=ui->lineEdit_3->text(); // масштаб
X= "https://static-maps.yandex.ru/1.x/?ll="+B+","+A+"&z="+C+"&size=600,450&l=map"; //сначала долгота
ui->preview->load(QUrl(X));
ui->preview->show();
manager = new QNetworkAccessManager();
connect(manager, &QNetworkAccessManager::finished, this, &MainWindow::onResult);
QNetworkRequest request(QUrl("https://mdb.api.cloud.yandex.net/managed-postgresql/v1/clusters/c9qmjpt4v23oohbuj1vu/databases/db1"));
// manager->get(QNetworkRequest(QUrl("http://www.evileg.ru/it_example.json")));
manager->get(request);
// manager->post(request, data);
}
void MainWindow::onResult(QNetworkReply *reply)
{
if(reply->error() == QNetworkReply::NoError){
QByteArray json_data = reply->readAll();
ui->textEdit->setPlainText(json_data)
}
else {
qDebug() << "error: " << reply->error();
}
reply->deleteLater();
}
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QUrlQuery>
#include <QUrl>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
void onResult(QNetworkReply *reply);
private:
Ui::MainWindow *ui;
QNetworkAccessManager* manager;
};
#endif // MAINWINDOW_H
所以,对于Windows用户和MSVC的编译器,如果遇到类似的问题,我可以建议做以下事情:
1. Win32 OpenSSL 1.0 .studio 可能不同),您可以下载轻量级。
2. 安装 Win32 OpenSSL。
3、从之前安装的OpenSLL的根文件夹中取出libeay32.dll、libssl32.dll、ssleay32.dll文件,沿着路径\Qt\5.12.1\msvc2017\bin发送(Qt和MSVC版本可能不同),我们按照位数发送。
4.我们检查性能
这个选项帮助了我。
QSslSocket::connectToHostEncrypted: TLS initialization failed将所有内容传输到虚拟机时遇到同样的问题。每次用Qt复制libs到文件夹不是很方便,很容易忘记,尤其是版本经常变化。因此,在该安装程序中,有必要将项目标记为复制 Windows 中的所有内容。更新:Qt 5.14 带来了一个已编译的 OpenSSL (
Qt\Tools\OpenSSL)。摆脱QSslSocket::connectToHostEncrypted: TLS initialization failed添加的PATH方式%QTDIR%/../../Tools/OpenSSL/Win_x64/bin也许它会对某人派上用场......最近我发现在一台 PC 上 SSL 库 libcrypto-1_1-x64.dll 和 libssl-1_1-x64.dll 不想被加载到任何一个。事实证明,它们依赖于 vcruntime140.dll,它包含在 Microsoft Visual C++ 2015 Update 3 RC 包中。您可以相应地要求安装整个软件包,但我只是将这个 vcruntime140.dll 包含在我的应用程序中,一切正常!