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

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

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

介紹

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

在使用http時需要在pro文件中添加對應(yīng)的模塊。

QT += network

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

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

int NormalGetRequest(QString paramer1, QString paramer2)
{
    //生成對應(yīng)的網(wǎng)絡(luò)請求
    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);
 
    //對請求的返回異常進(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的時候證明請求成功對包含的結(jié)構(gòu)數(shù)據(jù)進(jìn)行處理
        if(rootObj.contains("result"))
        {
 
        }
        return 0;
    }
    else
    {
        //請求失敗對對應(yīng)的處理
        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);
 
    //生成對應(yīng)的網(wǎng)絡(luò)請求
    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ù)進(jìn)行處理
        if(rootObj.contains("result"))
        {
 
        }
        return 0;
    }
    else
    {
        //請求失敗對對應(yīng)的處理
        return codeStr.toInt();
    }
}

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

int NormalPostRequest(QString paramer1, QString paramer2)
{
    //生成對應(yīng)的網(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");
 
    //獲取對應(yīng)的參數(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ù)進(jìn)行處理
        if(rootObj.contains("result"))
        {
 
        }
        return 0;
    }
    else
    {
        //請求失敗對對應(yīng)的處理
        return codeStr.toInt();
    }
}

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

int PostRequestWithFile(QString paramer1, QString paramer2,QString filePath)
{
 
    //生成對應(yīng)的網(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);
 
 
    //生成對應(yīng)的網(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ù)進(jìn)行處理
        if(rootObj.contains("result"))
        {
 
        }
        return 0;
    }
    else
    {
        //請求失敗對對應(yīng)的處理
        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()));
//如果需要下載進(jìn)度需要關(guān)聯(lián)對應(yīng)的信號
//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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

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

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

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

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

    OpenCV實(shí)現(xiàn)簡易標(biāo)定板

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

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

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

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

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

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

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

    C++中用兩個標(biāo)準(zhǔn)容器stack,實(shí)現(xiàn)一個隊(duì)列的方法詳解

    本篇文章是對C++中使用兩個標(biāo)準(zhǔn)容器stack,實(shí)現(xiàn)一個隊(duì)列的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    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ù)的算法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論

宁波市| 轮台县| 白玉县| 普兰县| 汕尾市| 兴化市| 松溪县| 德阳市| 历史| 弋阳县| 宜君县| 安乡县| 阿拉善盟| 拜城县| 新泰市| 伊宁县| 宁河县| 黑龙江省| 沅陵县| 枝江市| 瓮安县| 琼海市| 达州市| 深圳市| 岑溪市| 开阳县| 隆回县| 日喀则市| 尼木县| 南京市| 静宁县| 容城县| 安化县| 通河县| 吴忠市| 静宁县| 龙口市| 津市市| 崇义县| 富蕴县| 股票|