如何在QT中同步发送http请求

How to send http request synchronously in QT?

本文关键字:http 请求 同步 QT      更新时间:2023-10-16

以下代码使用QT的Network API发送HTTP请求并获得响应:

void AnotherHttpClient::finished(QNetworkReply *qNetworkReply)
{
qDebug() << qNetworkReply->readAll();
}
void AnotherHttpClient::get(QString url)
{
QNetworkAccessManager *man = new QNetworkAccessManager(this);
connect(man, &QNetworkAccessManager::finished, this, finished);
const QUrl qurl = QUrl(url);
QNetworkRequest request(qurl);
man->get(request);
}

我需要使此代码同步,并且我需要get方法来返回qNetworkReply。我该怎么做?BTW是否有其他同步方式在QT中发送Http请求?

您可以执行以下操作:

QNetworkAccessManager l_nm;
QUrl l_url ("http://foo.bar");
QNetworkRequest l_req(l_url);
QNetworkReply *l_reply = l_nm.get(l_req);
QEventLoop l_event_loop;
QObject::connect(l_reply, SIGNAL(finished()), &l_event_loop, SLOT(quit()));
l_event_loop.exec();

但是在Qt应用程序中使用事件循环是有史以来最糟糕的想法。

这是另一个"丑陋的";这样做的方式……但可能没有运行自定义事件循环那么丑陋,您实际上可以添加一些";助手";内部while循环并处理错误。

QNetworkRequest request(workingPath);
auto reply = m_WebCtrl.get(request);
uint count = 0;
bool waiting = reply->isFinished();
while (!waiting) {
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
count++;
waiting = reply->isFinished();
QThread::msleep(1);
if (count > 1000 * 10) {/// wait 10 seconds
waiting = true;
}
}