最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

QT使用Http協(xié)議通信的實現(xiàn)示例

 更新時間:2023年12月10日 16:19:17   作者:Acnidouwo  
使用QT進行應用開發(fā)時,有時候需要進行客戶端和服務端的網(wǎng)絡通信,本文主要介紹了QT使用Http協(xié)議通信的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下

介紹

使用QT進行應用開發(fā)時,有時候需要進行客戶端和服務端的網(wǎng)絡通信,網(wǎng)絡通信常用的一種協(xié)議就是http協(xié)議。QT對http協(xié)議進行了封裝,下面將介紹兩種http通信方式的使用。

在使用http時需要在pro文件中添加對應的模塊。

QT += network

http主要兩種通信方式為get和post兩種

1.多個獨立參數(shù)GET請求

int NormalGetRequest(QString paramer1, QString paramer2)
{
    //生成對應的網(wǎ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&paramer2=%2").arg(paramer1).arg(paramer2);
    request.setUrl(QUrl(fullRequest));
 
    //發(fā)送Get請求
    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的時候證明請求成功對包含的結(jié)構(gòu)數(shù)據(jù)進行處理
        if(rootObj.contains("result"))
        {
 
        }
        return 0;
    }
    else
    {
        //請求失敗對對應的處理
        return codeStr.toInt();
    }
}

2.參數(shù)數(shù)組GET請求

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);
 
    //生成對應的網(wǎ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));
 
    //獲取錯誤
    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的時候證明請求成功對包含的結(jié)構(gòu)數(shù)據(jù)進行處理
        if(rootObj.contains("result"))
        {
 
        }
        return 0;
    }
    else
    {
        //請求失敗對對應的處理
        return codeStr.toInt();
    }
}

3.上傳參數(shù)數(shù)據(jù)POST請求

int NormalPostRequest(QString paramer1, QString paramer2)
{
    //生成對應的網(wǎ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");
 
    //獲取對應的參數(shù)數(shù)據(jù)
    QByteArray data;
    data.append("paramer1=");
    data.append(paramer1.toUtf8());
    data.append("&paramer2=");
    data.append(paramer2.toUtf8());
 
    //發(fā)送請求
    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的時候證明請求成功對包含的結(jié)構(gòu)數(shù)據(jù)進行處理
        if(rootObj.contains("result"))
        {
 
        }
        return 0;
    }
    else
    {
        //請求失敗對對應的處理
        return codeStr.toInt();
    }
}

4.上傳參數(shù)和文件POST請求

int PostRequestWithFile(QString paramer1, QString paramer2,QString filePath)
{
 
    //生成對應的網(wǎng)址請求
    QFileInfo fileInfo(filePath);
    QString fileName =fileInfo.fileName();
 
    QFile* inputFile = new QFile(filePath);
    inputFile->open(QIODevice::ReadOnly);
 
    //multipart請求
    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);
 
 
    //生成對應的網(wǎ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ā)送請求
    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的時候證明請求成功對包含的結(jié)構(gòu)數(shù)據(jù)進行處理
        if(rootObj.contains("result"))
        {
 
        }
        return 0;
    }
    else
    {
        //請求失敗對對應的處理
        return codeStr.toInt();
    }
}

5.下載文件GET請求

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()));
//如果需要下載進度需要關聯(lián)對應的信號
//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;
}

 到此這篇關于QT使用Http協(xié)議通信的實現(xiàn)示例的文章就介紹到這了,更多相關QT Http協(xié)議通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談C++中thread庫join和detach的區(qū)別

    淺談C++中thread庫join和detach的區(qū)別

    這篇文章主要為大家介紹了C++中thread庫join和detach的區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 深入探究協(xié)程在C++中的實現(xiàn)方式

    深入探究協(xié)程在C++中的實現(xiàn)方式

    協(xié)程可以被看作是計算機程序中的獨立功能塊,它們在執(zhí)行過程中能夠暫停和恢復,與傳統(tǒng)的函數(shù)調(diào)用相比,協(xié)程更像是一種輕量級的線程,本文我們將深入探究協(xié)程在C++中的實現(xiàn)方式,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2023-12-12
  • c語言小游戲程序之彈跳小球的實現(xiàn)代碼

    c語言小游戲程序之彈跳小球的實現(xiàn)代碼

    這篇文章主要介紹了c語言小游戲程序之彈跳小球的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 深入淺析C/C++?的條件編譯

    深入淺析C/C++?的條件編譯

    條件編譯是指預處理的時候根據(jù)條件編譯的指令有條件的選擇源程序中的一部分代碼送給編譯器進行編譯,進行有選擇性的操作,防止宏替換的內(nèi)容重復包含,這篇文章主要介紹了C/C++?的條件編譯,需要的朋友可以參考下
    2022-04-04
  • OpenCV實現(xiàn)簡易標定板

    OpenCV實現(xiàn)簡易標定板

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)簡易標定板,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C語言中將日期和時間以字符串格式輸出的方法

    C語言中將日期和時間以字符串格式輸出的方法

    這篇文章主要介紹了C語言中將日期和時間以字符串格式輸出的方法,分別是ctime()函數(shù)和asctime()函數(shù),注意參數(shù)區(qū)別,需要的朋友可以參考下
    2015-08-08
  • C++面向行輸入之get()與getline()實例詳解

    C++面向行輸入之get()與getline()實例詳解

    在c++里當我們輸入一個字符串時習慣用cin,但是cin只能讀取一段不含空格的字符串,如果我們需要讀取一段包含空格的字符串時,就需要用到getline()或get(),下面這篇文章主要給大家介紹了關于C++面向行輸入之get()與getline()的相關資料,需要的朋友可以參考下
    2021-10-10
  • 利用Matlab繪制優(yōu)美的k線圖

    利用Matlab繪制優(yōu)美的k線圖

    本期又是一個花里胡哨的數(shù)據(jù)可視化,前兩天刷到了耐克的視覺設計師Gladys Orteza繪制的k線圖作品,把沉悶的股票圖變成了精彩的風景,但是那些大部分是真的完全看不清,我這里挑選了幾個能看清的k線圖風格將其用MATLAB進行了實現(xiàn)
    2022-10-10
  • C++中用兩個標準容器stack,實現(xiàn)一個隊列的方法詳解

    C++中用兩個標準容器stack,實現(xiàn)一個隊列的方法詳解

    本篇文章是對C++中使用兩個標準容器stack,實現(xiàn)一個隊列的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ 數(shù)據(jù)結(jié)構(gòu)之kmp算法中的求Next()函數(shù)的算法

    C++ 數(shù)據(jù)結(jié)構(gòu)之kmp算法中的求Next()函數(shù)的算法

    這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)之kmp算法中的求Next()函數(shù)的算法的相關資料,需要的朋友可以參考下
    2017-06-06

最新評論

榆树市| 泽库县| 阳江市| 黑河市| 罗平县| 榆社县| 民县| 六盘水市| 长兴县| 临夏市| 宕昌县| 红桥区| 双辽市| 镇赉县| 宁城县| 克东县| 当涂县| 泉州市| 绩溪县| 新乡县| 陆川县| 鹤壁市| 永安市| 神池县| 涿州市| 石泉县| 宝兴县| 新邵县| 调兵山市| 广宁县| 张家界市| 临邑县| 鄂伦春自治旗| 来宾市| 盐城市| 海盐县| 富蕴县| 宁强县| 乐安县| 卢湾区| 措美县|