QT HTTP Get 请求 SSL 错误

3

我只是想使用HTTP URL发送GET请求,但是出现了以下两个SSL错误:

>     qt.network.ssl: QSslSocket: cannot call unresolved function d2i_DHparams
>     qt.network.ssl: QSslSocket: cannot call unresolved function DH_free

我正在使用Windows 10和QTCreator(QT v5.8),我知道QT默认不会导入SSL库。然而,我发送的是HTTP请求而不是HTTPS请求,为什么我会收到SSL错误?

这里是产生错误的代码片段:

void MainWindow::sendGetRequest(QString& url)
{
    QNetworkAccessManager networkManager;
    QNetworkRequest request;

    QUrl httpRequest(url);

    request.setUrl(httpRequest);
    currentReply = networkManager.get(request);
    ui->label_2->setText("Request Sent...");

    connect(&networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onGetRequestResult(QNetworkReply*)));
}

void MainWindow::onGetRequestResult(QNetworkReply * reply)
{
    if (reply->error() != QNetworkReply::NoError) {
        ui->label_2->setText("Get Request Error!");
        return;
    }

    QString data = (QString) reply->readAll();
    qDebug() << data;

}
之后,就会抛出错误,且不会调用onGetRequestResult()插槽。

另外,我已下载了两个SSL二进制文件,但这并没有改变任何内容。是否有一种方法可以禁用GET请求的SSL,因为我不需要使用它。

谢谢!


编辑您的问题,通过添加您之前的评论。 - eyllanesc
HTTP请求的响应中可能会有一个重定向到https,Qt的HTTP堆栈会遵循它并尝试按照服务器的指示通过https访问该站点。 - Steffen Ullrich
假设响应正在通过 SSL 进行传输,但我如何修复这些错误?如果我使用 curl -X Get "url" ,它可以正常工作。然而,在 Windows 10 上,我没有使用 curl 的权限。 - Prateek Khatri
1
获取OpenSSL DLL文件并将它们放置在PATH /您的应用程序的.exe旁边/等位置? - peppe
@PrateekKhatri,听听jorp在说什么。 - zeFree
3个回答

0

如果您使用qt mingw gcc 32位,会出现一些QT窗口错误,请将ssleay32.dll和libeay32.dll复制到您的Windows应用程序可执行文件位置。在我的情况下是: Qt\Qt5.8.0\Tools\mingw530_32\opt\bin\ssleay32.dll Qt\Qt5.8.0\Tools\mingw530_32\opt\bin\libeay32.dll


0

我也遇到了同样的问题。这是对我有效的解决方案。

  1. 从此网站下载安装包
    http://slproweb.com/products/Win32OpenSSL.html
  2. 将其安装到任何位置。
  3. 将 OpenSSL DLLs 复制到 OpenSSL 二进制文件 (\bin) 目录中。
  4. 从 \bin 文件夹中复制 libeay32.dll、libssl32.dll 和 ssleay32.dll 到与 QtNetwork4.dll 或 QtNetworkd4.dll 相同的位置。

希望这可以帮助你! : )


-1

networkManager 在代码中被声明。

 `MainWindow::sendGetRequest()`,

执行后

 `sendGetRequest()`, 

networkManager 被销毁后,它的

finished(QNetworkReply*)

信号将不会被发射。

你应该将 networkManager 声明为 MainWindow 的成员。 或者考虑将其存储在堆中

(auto networkManger = new NetworkManager(this)),

如果它只被创建一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接