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

How to send http request synchronously in QT?

以下代码使用 QT 的网络 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);
}

我需要使此代码同步,并且我需要 return qNetworkReply 的获取方法。我应该怎么做? 顺便说一句,在 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;
            }
        }