【问题标题】:QtNeworkReply runs forever and never finishesQtNeworkReply 永远运行并且永远不会结束
【发布时间】:2021-08-05 10:04:37
【问题描述】:

我正在尝试为我正在开发的 Rest API 编写一个非常简单的客户端。

我要做的就是向我唯一的端点发送一个请求(没有参数,不是数据)并打印出发回的数据。

这是我的代码

#include <QCoreApplication>

#include <QNetworkReply>
#include <QNetworkRequest>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString address = "http://localhost/test_api/welcome.php";

    QUrl api_url = QUrl(address);

    qDebug() << "Sending the request";
    QNetworkAccessManager *networkManager = new QNetworkAccessManager();
        //connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(serviceRequestFinished(QNetworkReply*)));
    QNetworkReply *reply = networkManager->post(QNetworkRequest(api_url),QByteArray());

    while (!reply->isFinished()){
        if (!reply->isRunning()){
            break;
        }
    }

    qDebug() << "Reply is finished";

    if (reply->error() != QNetworkReply::NoError){
        qDebug() << "The following error ocurred";
        qDebug() << reply->errorString();
        return 0;
    }

    QString data_returned(reply->readAll());

    qDebug() << "DATA RETURNED";
    qDebug() << data_returned;

    return 0;
}

当我运行此代码时,它挂起,因为回复从未完成并且一直在运行。

我需要创建一个类来接收来自 QtNeworkManager 的完成信号还是我的代码有其他问题?

【问题讨论】:

    标签: qt


    【解决方案1】:

    一个可能的问题是while循环阻塞了异步请求的执行。一种可能的解决方案是使用 QEventLoop:

    QNetworkAccessManager *networkManager = new QNetworkAccessManager();
    QNetworkReply *reply = networkManager->post(QNetworkRequest(api_url),QByteArray());
    
    QEventLoop loop;
    QObject::conect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
    loop.exec();
    
    qDebug() << "Reply is finished";
    

    【讨论】:

    • 谢谢!!这就是问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2013-04-09
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2017-11-05
    相关资源
    最近更新 更多