欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

介紹

使用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&paramer2=%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("&paramer2=");
    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/C++迭代器的失效問(wèn)題詳解

    C/C++迭代器的失效問(wèn)題詳解

    這篇文章主要為大家詳細(xì)介紹了C/C++迭代器的失效問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C++ clock()解析如何使用時(shí)鐘計(jì)時(shí)的應(yīng)用

    C++ clock()解析如何使用時(shí)鐘計(jì)時(shí)的應(yīng)用

    本篇文章是對(duì)c++中的clock()函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C++進(jìn)程間共享數(shù)據(jù)實(shí)例

    C++進(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++需要注意的地方

    這篇文章主要介紹了零基礎(chǔ)學(xué)習(xí)C/C++需要注意的地方,文中講解非常細(xì)致,供大家參考和學(xué)習(xí),想要學(xué)習(xí)C/C++的可以閱讀此文
    2020-06-06
  • 關(guān)于C++中void*的小作用淺析

    關(guān)于C++中void*的小作用淺析

    這篇文章主要給大家介紹了關(guān)于C++中void*的一些小作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • C++11新特性之變長(zhǎng)參數(shù)模板詳解

    C++11新特性之變長(zhǎng)參數(shù)模板詳解

    本文主要介紹了C++11變長(zhǎng)參數(shù)模板,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 使用C語(yǔ)言實(shí)現(xiàn)最小生成樹(shù)求解的簡(jiǎn)單方法

    使用C語(yǔ)言實(shí)現(xiàn)最小生成樹(shù)求解的簡(jiǎn)單方法

    這篇文章主要介紹了使用C語(yǔ)言實(shí)現(xiàn)最小生成樹(shù)求解的簡(jiǎn)單方法,包括Prim算法和Kruskal算法的兩種求解方式,需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言結(jié)構(gòu)體數(shù)組常用的三種賦值方法(包含字符串)

    C語(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
  • C++實(shí)現(xiàn)簡(jiǎn)易五子棋游戲

    C++實(shí)現(xiàn)簡(jiǎn)易五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)易五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 二叉樹(shù)前序遍歷的非遞歸算法

    二叉樹(shù)前序遍歷的非遞歸算法

    這篇文章主要介紹了二叉樹(shù)前序遍歷的非遞歸算法,需要的朋友可以參考下
    2014-02-02

最新評(píng)論