#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. Спасибо!! Вот в чем была проблема!!