QT之HTTP的post请求+超时机制+json解析

最近项目用到了QT的HTTP的相关操作,主要是post请求,和收到数据后的json解析。另外还加入了超时的机制。
代码贴出来,供大家参考。

1、首先在.pro文件中加入下面这句话,因为使用网络相关功能必须加上

QT += network

2、然后是头文件:

#ifndef TEST_H
#define TEST_H

class TEST
{
    
    
public:
    
    TEST();
    
    void Post_Request();
    
    
    
};

#endif // TEST_H

3、源文件

#include "test.h"
#include <QHttpPart>
#include <QNetworkRequest>
#include "qnetworkreply.h"
#include <qnetworkaccessmanager.h>
#include <qeventloop.h>
#include <QTimer>
#include <QTextCodec>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonValue>



TEST::TEST()
{

}

void TEST::Post_Request()
{
    QString baseUrl = "http://192.168.6.31:20000/PostRequest";//请求的网址

    //参数1:
    QString Part1_value = "Part1_value";//值1
    QHttpPart Part1;
    Part1.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"Part1\";"));//添加参数名 Part1
    Part1.setBody(Part1_value.toUtf8());//添加参数值1

    //参数2:
    QString Part2_value = "Part2_value";//值2
    QHttpPart Part2;
    Part2.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"Part2\";"));//添加参数名  Part2
    Part2.setBody(Part2_value.toUtf8());//添加参数值2

    QNetworkRequest request;
    request.setUrl(baseUrl);

    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

    multiPart->append(Part1);
    multiPart->append(Part2);

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QNetworkReply *reply=manager->post(request,multiPart);//发送数据,返回结果

    //添加事件循环机制,返回后再运行后面的
    QEventLoop eventLoop;
    QTimer timer;//开启一个定时器,用于超时处理
    timer.setInterval(3000);//设置超时时间,单位ms
    timer.setSingleShot(true);//设置为只触发一次

    connect(&timer,SIGNAL(timeout()), &eventLoop, SLOT(quit()));
    connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));

    timer.start();//启动定时器
    eventLoop.exec();       //阻塞模式直到完成

    /* 处理响应 */
    if (timer.isActive()) {//定时器仍在运行,说明没超时
        QString ID;
        QString DATE;
        QString message;
        if (reply->error() == QNetworkReply::NoError)//无错误
        {
            qDebug() << "NoError";
            //请求收到的结果
            QByteArray responseByte = reply->readAll();//读取
            QTextCodec *codec = QTextCodec::codecForName("utf8");
            QString str = codec->toUnicode(responseByte);//格式转换

            QJsonDocument document;
            QJsonParseError ParseError;
            document =QJsonDocument::fromJson(str.toUtf8(),&ParseError);//json解析

            if(!document.isNull() && ParseError.error == QJsonParseError::NoError)//解析成功且不为空
            {
                if(document.isObject())//判断是否是对象
                {
                    QJsonObject Object = document.object(); //获取文档对象
                    if(!Object.isEmpty())//是否为空
                    {
                        if(Object.contains("msg"))//成员解析
                        {
                            QJsonValue msg = Object.value("msg");
                            if(msg.isString())
                            {
                                message = msg.toString();
                            }
                        }
                        if(Object.contains("id"))
                        {
                            QJsonValue id = Object.value("id");
                            if(id.isString())
                            {
                                ID = id.toString();
                            }
                        }
                        if(Object.contains("date"))
                        {
                            QJsonValue date = Object.value("date");
                            if(date.isString())
                            {
                                DATE = date.toString();
                            }
                        }
                    }
                    //下面添加对解析到的数据进行处理

                }
            }
        }
        else
        {
            qDebug()<<"request protobufHttp handle errors here";
            //statusCodeV是HTTP服务器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档
            QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
            qDebug( "request protobufHttp found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
            qDebug(qPrintable(reply->errorString()));
        }
    }
    else {
        disconnect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
        reply->abort();//终止操作并关闭连接
        qDebug("time out");
    }
    reply->deleteLater();//删除对象
}

以上就是QT的post请求的全部操作,代码中特别添加了定时器,用于发送或响应超时情况下的处理。

如果觉得这篇文章对您有帮助,欢迎点赞、评论、转发、收藏!您的支持是我创作的最大动力!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐