詳解QT使用http通信的同步和異步
在Qt與Http通信的時候,會根據(jù)不同的情況使用同步或者異步的方式進行數(shù)據(jù)請求。
同步,即發(fā)送Http請求之后,會一直等待服務器返回的數(shù)據(jù),接收到數(shù)據(jù)之前,程序一直阻塞。
異步,即發(fā)送Http請求之后,程序可以繼續(xù)往下執(zhí)行,接收到服務器返回的數(shù)據(jù)時自動調(diào)用其對應的槽函數(shù)處理數(shù)據(jù)。
同步需要在發(fā)送請求之后,放置一個QEnentLoop,而異步只需要綁定對應的槽函數(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請求二選一 QUrl url(urlHead+"exam_start/"+studentId); request->setUrl(url); manager->get(*request);//發(fā)送get請求 ????QByteArray postData = document.toJson(QJsonDocument::Compact); request->setUrl(url); request->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json")); manager->post(*request, postData);//發(fā)送post請求
槽函數(shù)
void MainWindow::finishedSlot(QNetworkReply *reply) { qDebug() << "進入函數(shù): " << __FUNCTION__; QString json = reply->readAll();//這個返回的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); // 準備工作 - 初始化一個QNetworkRequest QNetworkRequest res6; //設置頭 - 瀏覽器 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); // 讀服務器回寫的數(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(); });
到此這篇關于詳解QT使用http通信的同步和異步的文章就介紹到這了,更多相關QT http通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++ 簡單實現(xiàn)MFC ListControl 點擊列頭排序
這篇文章主要介紹了C++ 簡單實現(xiàn)MFC ListControl 點擊列頭排序的相關資料,需要的朋友可以參考下2015-06-06C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)鄰接表
這篇文章主要為大家詳細介紹了C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)鄰接表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04C語言實現(xiàn)統(tǒng)計100以內(nèi)所有素數(shù)的個數(shù)
本文詳細講解了C語言實現(xiàn)統(tǒng)計100以內(nèi)所有素數(shù)個數(shù)的方法,文中通過示例代碼介紹的非常詳細。需要的朋友可以收藏下,方便下次瀏覽觀看2021-11-11c語言字符串函數(shù)strstr,strtok,strerror的使用和實現(xiàn)
C語言中的字符串處理函數(shù)如strtok、strstr和strerror對于字符串的處理有著重要的作用,strtok函數(shù)用于分割字符串,它通過sep參數(shù)指定的分隔符來分割str參數(shù)指定的字符串,并返回分割后的每個子字符串2024-10-10用C/C++實現(xiàn)linux下檢測網(wǎng)絡接口狀態(tài)
這篇文章主要為大家詳細介紹了用c/c++實現(xiàn)linux下檢測網(wǎng)絡接口狀態(tài),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06