最近轉行學習Qt,不得不說,仍是Java寫得舒服。 回到正題,在使用Qt時,可能會使用network模塊來進行網絡操做,好比tcp、http請求,我將在下文講述如何經過Qt進行http請求以及處理響應的相關操做。c++
Qt經過QNetworkAccessManager來管理網絡請求,Qt提供了QNetworkCookieJar來管理Cookie,固然你能夠經過手工管理request的header來管理Cookie,不過相對麻煩。服務器
QNetworkAccessManager *manager = new QNetworkAccessManager; // 添加了QNetworkCookieJar // 能夠本身寫個類繼承QNetworkCookieJar,調用QNetworkCookieJar的allCookies函數來獲取cookie列表 manager->setCookieJar(&cookieJar);
因爲QNetworkAccessManager的請求回傳使用的是異步傳輸,因此能夠用Qt信號槽機制來進行response的獲取。cookie
// 這裏使用QEventLoop來進行循環等待 QEventLoop *loop = new QEventLoop; connect(manager, SIGNAL(finished(QNetworkReply*)), loop, SLOT(quit())); QNetworkRequest request(QUrl("your uri")); QNetworkReply *reply = manager->get(request); loop->exec();
能夠經過QNetworkReply的readAll()成員函數來獲取返回的具體內容:網絡
QByteArray bytes = reply->readAll(); qDebug() << bytes;
在得到服務器的響應後,程序編寫者可能須要得到響應的http狀態碼,具體步驟以下:app
// QNetworkReply // attribute函數返回QVariant對象,使用value<T>()函數返回進行向下轉型 qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).value<int>();
官方文檔這麼表述改方法:異步
QVariant QNetworkReply::attribute(QNetworkRequest::Attribute code) const Returns the attribute associated with the code code. If the attribute has not been set, it returns an invalid QVariant (type QMetaType::UnknownType). You can expect the default values listed in QNetworkRequest::Attribute to be applied to the values returned by this function.tcp
意思是attribute函數返回code代碼對應的參數。若是參數沒有被設置,函數將返回無效的QVariant對象(Invalid QVariant),你能使用QNetworkRequest::Attribute中提供的參數當錯code來調用attribute函數並返回你須要的值。經常使用的參數有:函數