Qt HTTP请求同步调用

53 篇文章 2 订阅
53 篇文章 36 订阅

在Qt中,进行HTTP就行现在官方提倡使用QNetworkAccessManager,其和QNetworkRequest和QNetworkReply配合使用,来完成,其是只支持异步的操作。最近使用QML做些android的小程序,需要进行HTTPS的操作,开始是使用的JS中的XMLHttpRequest,其不能使用HTTPS,我很郁闷,那只有使用C++来完成,但是又发现只支持异步,但是我希望在进行网络操作时,不要响应客户的响应,给我提示,那么如果是异步,那么请求本身就需要能够标识其操作,我想如果是同步该多好啊。
然后就有了下面的代码

const int TIMEOUT = (30 * 1000);
QString Supporter::httpsPostHelp(const QString &url, const QString &data)
{
    QString _result;
    QNetworkRequest _request;
    _request.setUrl(QUrl(url));
    QSslConfiguration _sslCon = _request.sslConfiguration();
    _sslCon.setPeerVerifyMode(QSslSocket::VerifyNone);
    _request.setSslConfiguration(_sslCon);
    _request.setHeader(QNetworkRequest::ContentTypeHeader,
                       QString("application/x-www-form-urlencoded"));

    QNetworkReply *_reply = m_NtwkAccManager.post(_request, data.toLatin1());
    _reply->ignoreSslErrors();


    QTime _t;
    _t.start();

    bool _timeout = false;

    while (!_reply->isFinished()) {
        QApplication::processEvents();
        if (_t.elapsed() >= TIMEOUT) {
            _timeout = true;
            break;
        }
    }

    if (!_timeout && _reply->error() == QNetworkReply::NoError) {
        _result = _reply->readAll();
    }

    _reply->deleteLater();

    return _result;

}

开始的时候我没有加 QApplication::processEvents() 导致了事件阻塞在循环这边,那也就拿不到网络返回的数据,其实网络操作还是异步的,我们只是在一个循环中处理时间并等待,这样可以做到同步和程序正常的事件循环。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 你可以使用QT的QNetworkAccessManager类来发出HTTP同步请求。你可以用QNetworkRequest类来创建一个请求,然后使用QNetworkAccessManager的get()方法发出请求,使用QNetworkReply来处理响应。 ### 回答2: QT中可以使用QNetworkAccessManager类来进行HTTP同步请求,以下是一个示例代码: ```cpp #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkReply> #include <QEventLoop> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QNetworkAccessManager manager; // 创建一个QNetworkRequest对象,设置请求的URL QNetworkRequest request; request.setUrl(QUrl("http://www.example.com")); // 发送同步GET请求 QNetworkReply* reply = manager.get(request); // 创建一个事件循环等待请求完成 QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); // 检查请求是否发生错误 if(reply->error() == QNetworkReply::NoError) { // 读取响应数据 QByteArray responseData = reply->readAll(); qDebug() << responseData; } else { // 发生错误时处理错误信息 qDebug() << "Error: " << reply->errorString(); } // 释放reply对象 reply->deleteLater(); return a.exec(); } ``` 上述代码创建了一个QNetworkAccessManager对象manager,并发起了一个GET请求。通过连接reply的finished信号,将事件循环loop与请求的完成关联起来,实现了同步请求。循环通过调用exec()方法,等待请求完成。完成后,可以通过reply->error()方法检查请求是否发生错误,如果没有发生错误,则可以通过readAll()方法读取响应数据。如果发生错误,则可以通过errorString()方法获取错误信息。 需要注意的是,上述代码是在控制台程序中使用,如果在GUI程序中使用,可能需要进行一些相应的调整。 ### 回答3: Qt提供了一个QNetworkAccessManager类,可以用于发送HTTP请求并接收响应。下面是一个简单的示例代码展示如何使用Qt进行HTTP同步请求。 ```cpp #include <QtNetwork> // 创建一个HTTP同步请求 QNetworkRequest request; request.setUrl(QUrl("http://example.com")); // 设置请求的URL QNetworkAccessManager manager; QNetworkReply *reply = manager.get(request); // 发送GET请求 // 等待请求完成 QEventLoop loop; QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); loop.exec(); // 读取响应 if (reply->error() == QNetworkReply::NoError) { QByteArray response = reply->readAll(); qDebug() << "Response:" << response; } else { qDebug() << "Error:" << reply->errorString(); } // 清理资源 reply->deleteLater(); ``` 首先,我们创建一个QNetworkRequest对象,并设置请求的URL。然后,我们创建一个QNetworkAccessManager对象,并使用get方法发送GET请求,该方法返回一个QNetworkReply对象,表示请求的响应。 我们利用QEventLoop来等待请求完成,通过连接QNetworkReply的finished信号与QEventLoop的quit槽函数来实现。在事件循环结束后,我们可以检查QNetworkReply对象的error方法来判断请求是否成功。如果成功,我们可以使用readAll方法来读取响应的内容。 最后,我们需要手动释放QNetworkReply对象的内存,以避免内存泄漏。 总结起来,Qt中进行HTTP同步请求可以通过使用QNetworkAccessManager发送请求,并利用QEventLoop来等待请求完成。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值