QT使用Http協(xié)議通信的實(shí)現(xiàn)示例
介紹
使用QT進(jìn)行應(yīng)用開(kāi)發(fā)時(shí),有時(shí)候需要進(jìn)行客戶端和服務(wù)端的網(wǎng)絡(luò)通信,網(wǎng)絡(luò)通信常用的一種協(xié)議就是http協(xié)議。QT對(duì)http協(xié)議進(jìn)行了封裝,下面將介紹兩種http通信方式的使用。
在使用http時(shí)需要在pro文件中添加對(duì)應(yīng)的模塊。
QT += network
http主要兩種通信方式為get和post兩種
1.多個(gè)獨(dú)立參數(shù)GET請(qǐng)求
int NormalGetRequest(QString paramer1, QString paramer2)
{
//生成對(duì)應(yīng)的網(wǎng)絡(luò)請(qǐng)求
QNetworkRequest request;
QString scheme = "http";
QString serverAddr = "192.168.0.1";
QString port = "80";
QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
QString fullRequest = requestHeader + QString("/api/vi/user/getrequest?paramer1=%1¶mer2=%2").arg(paramer1).arg(paramer2);
request.setUrl(QUrl(fullRequest));
//發(fā)送Get請(qǐng)求
QNetworkAccessManager manager;
QNetworkReply *reply = manager.get(request);
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
//對(duì)請(qǐng)求的返回異常進(jìn)行處理
if(reply->error() != QNetworkReply::NoError)
{
return reply->error();
}
//解析返回的Json結(jié)果
QByteArray replyData = reply->readAll();
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
if(json_error.error != QJsonParseError::NoError)
{
return -1;
}
QJsonObject rootObj = jsonDoc.object();
QString codeStr = rootObj.value("code").toString();
if (codeStr.compare("200") == 0)
{
//返回代碼為200的時(shí)候證明請(qǐng)求成功對(duì)包含的結(jié)構(gòu)數(shù)據(jù)進(jìn)行處理
if(rootObj.contains("result"))
{
}
return 0;
}
else
{
//請(qǐng)求失敗對(duì)對(duì)應(yīng)的處理
return codeStr.toInt();
}
}
2.參數(shù)數(shù)組GET請(qǐng)求
int GetRequestWithArray(QVector<QString> m_filePathVector)
{
QJsonArray array;
for(int index=0; index<m_filePathVector.size(); ++index)
{
QJsonObject object;
object.insert("index",QString::number(index));
object.insert("path",m_filePathVector.at(index));
array.append(object);
}
QJsonDocument document;
document.setArray(array);
QString arrayString = document.toJson(QJsonDocument::Compact);
//生成對(duì)應(yīng)的網(wǎng)絡(luò)請(qǐng)求
QNetworkRequest request;
QString scheme = "http";
QString serverAddr = "192.168.0.1";
QString port = "80";
QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
QString fullRequest = requestHeader + QString("/api/vi/user/getarray?paramers=%1").arg(arrayString);
request.setUrl(QUrl(fullRequest));
//獲取錯(cuò)誤
QNetworkAccessManager manager;
QNetworkReply *reply = manager.get(request);
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
if(reply->error() != QNetworkReply::NoError)
{
return reply->error();
}
//解析返回的Json結(jié)果
QByteArray replyData = reply->readAll();
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
if(json_error.error != QJsonParseError::NoError)
{
return -1;
}
QJsonObject rootObj = jsonDoc.object();
QString codeStr = rootObj.value("code").toString();
if (codeStr.compare("200") == 0)
{
//返回代碼為200的時(shí)候證明請(qǐng)求成功對(duì)包含的結(jié)構(gòu)數(shù)據(jù)進(jìn)行處理
if(rootObj.contains("result"))
{
}
return 0;
}
else
{
//請(qǐng)求失敗對(duì)對(duì)應(yīng)的處理
return codeStr.toInt();
}
}
3.上傳參數(shù)數(shù)據(jù)POST請(qǐng)求
int NormalPostRequest(QString paramer1, QString paramer2)
{
//生成對(duì)應(yīng)的網(wǎng)址請(qǐng)求
QNetworkRequest request;
QString scheme = "http";
QString serverAddr = "192.168.0.1";
QString port = "80";
QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
QString fullRequest = requestHeader + "/api/v1/user/postrequest";
request.setUrl(QUrl(fullRequest));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
//獲取對(duì)應(yīng)的參數(shù)數(shù)據(jù)
QByteArray data;
data.append("paramer1=");
data.append(paramer1.toUtf8());
data.append("¶mer2=");
data.append(paramer2.toUtf8());
//發(fā)送請(qǐng)求
QNetworkAccessManager manager;
QNetworkReply *reply = manager.post(request,data);
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
if(reply->error() != QNetworkReply::NoError)
{
return reply->error();
}
//解析返回的Json結(jié)果
QByteArray replyData = reply->readAll();
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
if(json_error.error != QJsonParseError::NoError)
{
return -1;
}
QJsonObject rootObj = jsonDoc.object();
QString codeStr = rootObj.value("code").toString();
if (codeStr.compare("200") == 0)
{
//返回代碼為200的時(shí)候證明請(qǐng)求成功對(duì)包含的結(jié)構(gòu)數(shù)據(jù)進(jìn)行處理
if(rootObj.contains("result"))
{
}
return 0;
}
else
{
//請(qǐng)求失敗對(duì)對(duì)應(yīng)的處理
return codeStr.toInt();
}
}
4.上傳參數(shù)和文件POST請(qǐng)求
int PostRequestWithFile(QString paramer1, QString paramer2,QString filePath)
{
//生成對(duì)應(yīng)的網(wǎng)址請(qǐng)求
QFileInfo fileInfo(filePath);
QString fileName =fileInfo.fileName();
QFile* inputFile = new QFile(filePath);
inputFile->open(QIODevice::ReadOnly);
//multipart請(qǐng)求
QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
//文件塊
QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant(QString("form-data; name=\"uploadfile\";filename=\"%1\"").arg(fileName)));
filePart.setBodyDevice(inputFile);
inputFile->setParent(multiPart);
multiPart->append(filePart);
QHttpPart paramer1Part;
paramer1Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"paramer1\""));
paramer1Part.setBody(paramer1.toUtf8());
multiPart->append(paramer1Part);
QHttpPart paramer2Part;
paramer2Part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"paramer2\""));
paramer2Part.setBody(paramer2.toUtf8());
multiPart->append(paramer2Part);
//生成對(duì)應(yīng)的網(wǎng)址請(qǐng)求
QNetworkRequest request;
QString scheme = "http";
QString serverAddr = "192.168.0.1";
QString port = "80";
QString requestHeader = scheme + QString("://") + serverAddr + QString(":") + port;
QString fullRequest = requestHeader + "/api/v1/user/postrequestwithfile";
request.setUrl(QUrl(fullRequest));
//發(fā)送請(qǐng)求
QNetworkAccessManager manager;
QNetworkReply *reply = manager.post(request,multiPart);
multiPart->setParent(reply);
QEventLoop eventLoop;
QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)),&eventLoop, SLOT(quit()));
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
if(reply->error() != QNetworkReply::NoError)
{
return reply->error();
}
//解析返回的Json結(jié)果
QByteArray replyData = reply->readAll();
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(replyData, &json_error));
if(json_error.error != QJsonParseError::NoError)
{
return -1;
}
QJsonObject rootObj = jsonDoc.object();
QString codeStr = rootObj.value("code").toString();
if (codeStr.compare("200") == 0)
{
//返回代碼為200的時(shí)候證明請(qǐng)求成功對(duì)包含的結(jié)構(gòu)數(shù)據(jù)進(jìn)行處理
if(rootObj.contains("result"))
{
}
return 0;
}
else
{
//請(qǐng)求失敗對(duì)對(duì)應(yīng)的處理
return codeStr.toInt();
}
}
5.下載文件GET請(qǐng)求
int DownloadFileFromWeb(QString fileUrl,QString&fileSavePath)
{
QNetworkRequest request;
QUrl url(fileUrl);
QFileInfo fileInfo(url.path());
QString fileName = fileInfo.fileName();
QNetworkAccessManager *accessManager=new QNetworkAccessManager();
request.setUrl(url);
QNetworkReply *reply = accessManager->get(request);
QEventLoop loop;
QObject::connect(accessManager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));
//如果需要下載進(jìn)度需要關(guān)聯(lián)對(duì)應(yīng)的信號(hào)
//connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(LoadProgress(qint64, qint64)));
loop.exec(QEventLoop::ExcludeUserInputEvents);
//獲取下載返回值
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
if (statusCode.toInt() != 200)
{
return -1;
}
//保存下載的文件
QFile file(fileSavePath);
if(!file.open(QIODevice::WriteOnly))
{
return -2;
}
file.write(reply->readAll());
file.close();
return 0;
}到此這篇關(guān)于QT使用Http協(xié)議通信的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)QT Http協(xié)議通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文詳解C++子類函數(shù)為什么不能重載父類函數(shù)
這篇文章主要介紹了一文詳解C++子類函數(shù)為什么不能重載父類函數(shù),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09
C++中的explicit關(guān)鍵字實(shí)例淺析
在C++程序中很少有人去使用explicit關(guān)鍵字,不可否認(rèn),在平時(shí)的實(shí)踐中確實(shí)很少能用的上,再說(shuō)C++的功能強(qiáng)大,往往一個(gè)問(wèn)題可以利用好幾種C++特性去解決。接下來(lái)給大家介紹 C++中的explicit關(guān)鍵字,需要的朋友可以參考下2017-03-03
c++結(jié)合opencv如何實(shí)現(xiàn)讀取多張圖片并顯示
這篇文章主要介紹了c++結(jié)合opencv如何實(shí)現(xiàn)讀取多張圖片并顯示問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C++20新特性之ranges::sort的使用小結(jié)
C++20引入了強(qiáng)大的ranges庫(kù),為標(biāo)準(zhǔn)庫(kù)提供了更加現(xiàn)代化和方便的操作工具,本文將深入介紹ranges庫(kù)的一些重要特性,包括新的排序算法和范圍視圖,及如何使用這些特性優(yōu)雅地進(jìn)行容器操作,感興趣的可以了解一下2025-12-12
C++ Boost Coroutine使用協(xié)程詳解
通過(guò)Boost.Coroutine,可以在C++中使用協(xié)程。協(xié)程是其他編程語(yǔ)言的一個(gè)特性,通常使用關(guān)鍵字yield來(lái)表示協(xié)程。在這些編程語(yǔ)言中,yield可以像return一樣使用2022-11-11
C++類的返回值是*this的成員函數(shù)問(wèn)題
這篇文章主要介紹了C++類的返回值是*this的成員函數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

