詳解QT使用http通信的同步和異步
在Qt與Http通信的時(shí)候,會(huì)根據(jù)不同的情況使用同步或者異步的方式進(jìn)行數(shù)據(jù)請(qǐng)求。
同步,即發(fā)送Http請(qǐng)求之后,會(huì)一直等待服務(wù)器返回的數(shù)據(jù),接收到數(shù)據(jù)之前,程序一直阻塞。
異步,即發(fā)送Http請(qǐng)求之后,程序可以繼續(xù)往下執(zhí)行,接收到服務(wù)器返回的數(shù)據(jù)時(shí)自動(dòng)調(diào)用其對(duì)應(yīng)的槽函數(shù)處理數(shù)據(jù)。
同步需要在發(fā)送請(qǐng)求之后,放置一個(gè)QEnentLoop,而異步只需要綁定對(duì)應(yīng)的槽函數(shù)即可。
同步Demo:
QUrl url(myurl);
QNetworkReply *reply = quitmanager->get(QNetworkRequest(QUrl(url)));
QEventLoop eventLoop;
connect(quitmanager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
eventLoop.exec(); //block until finish
//reply->readall()
reply->deleteLater();
reply = nullptr;
return true;
異步Demo:
QNetworkAccessManager *manager = new QNetworkAccessManager;
QNetworkRequest *request = new QNetworkRequest;
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finishedSlot(QNetworkReply*)));//綁定槽函數(shù)
//get post請(qǐng)求二選一
QUrl url(urlHead+"exam_start/"+studentId);
request->setUrl(url);
manager->get(*request);//發(fā)送get請(qǐng)求
????QByteArray postData = document.toJson(QJsonDocument::Compact);
request->setUrl(url);
request->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
manager->post(*request, postData);//發(fā)送post請(qǐng)求
槽函數(shù)
void MainWindow::finishedSlot(QNetworkReply *reply)
{
qDebug() << "進(jìn)入函數(shù): " << __FUNCTION__;
QString json = reply->readAll();//這個(gè)返回的JSON包所攜帶的所有信息
QJsonParseError jsonerror;
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8(), &jsonerror);
??????? if (!doc.isNull() && jsonerror.error == QJsonParseError::NoError)
{
QJsonObject object = doc.object();
if(object.contains("type"))
{
switch (object.value("type").toInt())
{
case 1:parseLogJason(object);break;
case 2:parseParameterJason(object);break;
case 3:parseExamStartJason(object);break;
case 4:parseExamEndJason(object);break;
default:return;
}
}
}
}
異步也可以將槽函數(shù)寫在函數(shù)內(nèi) 依然是異步
QNetworkAccessManager* manager6 = new QNetworkAccessManager(this);
// 準(zhǔn)備工作 - 初始化一個(gè)QNetworkRequest
QNetworkRequest res6;
//設(shè)置頭 - 瀏覽器
res6.setHeader(QNetworkRequest::UserAgentHeader,
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36");
res6.setUrl(QUrl("http://" + IP + "/version"));
QNetworkReply* reply6 = manager6->get(res6);
reply6->attribute(QNetworkRequest::HttpStatusCodeAttribute);
reply6->attribute(QNetworkRequest::RedirectionTargetAttribute);
// 讀服務(wù)器回寫的數(shù)據(jù)
connect(reply6, &QNetworkReply::readyRead, this, [=]()
{
//QVariant str = reply6->header(QNetworkRequest::LocationHeader);
QByteArray data = reply6->readAll();
//qDebug() << "version "<< data ;
QString str = QString(data);
int pos = str.indexOf('-');
version[node_id] = str.mid(pos + 3, 2) + "."+ str.mid(0, pos ) ;
reply6->abort();
reply6->close();
reply6->deleteLater();
manager6->deleteLater();
});到此這篇關(guān)于詳解QT使用http通信的同步和異步的文章就介紹到這了,更多相關(guān)QT http通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c語言數(shù)據(jù)結(jié)構(gòu)與算法之順序表的定義實(shí)現(xiàn)詳解
這篇文章主要介紹了c語言數(shù)據(jù)結(jié)構(gòu)與算法之順序表的定義實(shí)現(xiàn)詳解,用順序存儲(chǔ)的方式實(shí)現(xiàn)線性表順序存儲(chǔ),把邏輯上相鄰的元素存儲(chǔ)在物理位置上也相鄰的存儲(chǔ)單元中,元素之間的關(guān)系由存儲(chǔ)單元的鄰接關(guān)系來體現(xiàn),需要的朋友可以參考下2023-08-08
詳解C++ STL模擬實(shí)現(xiàn)forward_list
forward_list是C++ 11新增的容器,它支持從容器中的任何位置快速插入和移除元素的容器,不支持快速隨機(jī)訪問。本文將模擬實(shí)現(xiàn)forward_list,感興趣的可以了解一下2023-01-01
OpenCV圖像旋轉(zhuǎn)Rotate的詳細(xì)介紹
這篇文章主要介紹了OpenCV圖像旋轉(zhuǎn)Rotate,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

