Qt HTTP請求同步調用

在Qt中,進行HTTP就行如今官方提倡使用QNetworkAccessManager,其和QNetworkRequest和QNetworkReply配合使用,來完成,其是隻支持異步的操做。最近使用QML作些android的小程序,須要進行HTTPS的操做,開始是使用的JS中的XMLHttpRequest,其不能使用HTTPS,我很鬱悶,那只有使用C++來完成,可是又發現只支持異步,可是我但願在進行網絡操做時,不要響應客戶的響應,給我提示,那麼若是是異步,那麼請求自己就須要可以標識其操做,我想若是是同步該多好啊。
而後就有了下面的代碼android

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() 致使了事件阻塞在循環這邊,那也就拿不到網絡返回的數據,其實網絡操做仍是異步的,咱們只是在一個循環中處理時間並等待,這樣能夠作到同步和程序正常的事件循環。小程序

相關文章
相關標籤/搜索