QtNeworkReply работает вечно и никогда не заканчивается

#qt

Вопрос:

Я пытаюсь написать очень простой клиент для 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 или с моим кодом что-то еще не так?

Ответ №1:

Одна из возможных проблем заключается в том, что цикл while блокирует выполнение асинхронного запроса. Одним из возможных решений является использование QEventLoop:

 QNetworkAccessManager *networkManager = new QNetworkAccessManager();
QNetworkReply *reply = networkManager->post(QNetworkRequest(api_url),QByteArray());

QEventLoop loop;
QObject::conect(reply, amp;QNetworkReply::finished, amp;loop, amp;QEventLoop::quit);
loop.exec();

qDebug() << "Reply is finished";
 

Комментарии:

1. Спасибо!! Вот в чем была проблема!!