Qt HTTP请求同步调用

来源:互联网 发布:网络兼职诈骗案例 编辑:程序博客网 时间:2024/05/19 07:42

在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 0
原创粉丝点击