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)文章希望大家以后多多支持腳本之家!
- Qt串口通信開(kāi)發(fā)之QSerialPort模塊詳細(xì)使用方法與實(shí)例
- Qt串口通信開(kāi)發(fā)之Qt串口通信模塊QSerialPort開(kāi)發(fā)完整實(shí)例(串口助手開(kāi)發(fā))
- Qt串口通信開(kāi)發(fā)之QSerialPort模塊Qt串口通信接收數(shù)據(jù)不完整的解決方法
- Qt串口通信開(kāi)發(fā)之QSerialPort模塊簡(jiǎn)單使用方法與實(shí)例
- QT串口通信的實(shí)現(xiàn)方法
- QT5實(shí)現(xiàn)UDP通信的示例代碼
- Qt實(shí)現(xiàn)兩個(gè)獨(dú)立窗口的信號(hào)通信
- QT5實(shí)現(xiàn)簡(jiǎn)單的TCP通信的實(shí)現(xiàn)
相關(guān)文章
C++ clock()解析如何使用時(shí)鐘計(jì)時(shí)的應(yīng)用
本篇文章是對(duì)c++中的clock()函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06C++進(jìn)程間共享數(shù)據(jù)實(shí)例
這篇文章主要介紹了C++進(jìn)程間共享數(shù)據(jù)的方法,是進(jìn)行C++應(yīng)用程序開(kāi)發(fā)中非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方
這篇文章主要介紹了零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方,文中講解非常細(xì)致,供大家參考和學(xué)習(xí),想要學(xué)習(xí)C/C++的可以閱讀此文2020-06-06使用C語(yǔ)言實(shí)現(xiàn)最小生成樹(shù)求解的簡(jiǎn)單方法
這篇文章主要介紹了使用C語(yǔ)言實(shí)現(xiàn)最小生成樹(shù)求解的簡(jiǎn)單方法,包括Prim算法和Kruskal算法的兩種求解方式,需要的朋友可以參考下2015-08-08C語(yǔ)言結(jié)構(gòu)體數(shù)組常用的三種賦值方法(包含字符串)
C語(yǔ)言只有在定義字符數(shù)組的時(shí)候才能用“=”來(lái)初始化變量,其它情況下是不能直接用“=”來(lái)為字符數(shù)組賦值的,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言結(jié)構(gòu)體數(shù)組常用的三種賦值方法,需要的朋友可以參考下2022-06-06