Qt + HTTP 线程交互类封装

介绍

QT的HTTP模块封装的交互类,线程运行。使用时添加自己的业务逻辑即可

代码

头文件

cpp 复制代码
/**
 * @file httpcontroller.h
 * @brief 云台相机的协议交互类
 * @author xintong-zhou
 * @date 2024-03-13
 */

#ifndef HTTPCONTROLLER_H
#define HTTPCONTROLLER_H

#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QUrlQuery>
#include <QHttpMultiPart>
#include <QHttpPart>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QCryptographicHash>
#include <QThread>

class HttpWorker : public QObject
{
    Q_OBJECT

public:
    HttpWorker();
    ~HttpWorker();

    /**
     * @brief 某条信息的处理
     * @param object json对象
     */
    void dealXXInfo(const QJsonObject &object);


public slots:
    /**
     * @brief 执行请求
     * @param url 请求地址
     * @param arg 请求参数
     */
    void slotPostHttpRequest(const QString &url, const QJsonObject &obj);

    /**
     * @brief 保存交互返回数据
     */
    void slotReadyRead();
    void slotReplyFinished();

    /**
     * @brief 返回数据接收完毕分发处理
     * @param recvBuffer 接收到的json数据
     */
    void slotRecvData(const QByteArray &recvBuffer);


signals:
    /**
     * @brief 向上转发结果
     */
    void sigResult();

private:
    QNetworkAccessManager *m_pManager = nullptr;
};


class HttpController : public QObject
{
    Q_OBJECT
public:
    explicit HttpController(QObject *parent = nullptr);
    ~HttpController();

    /**
     * @brief 设置时间日期
     * @param datetime 时间日期
     */
    void setDateTimeInfo(const QDateTime &datetime);

public slots:
    /**
     * @brief 线程退出
     */
    void slotExitThread();

    /**
     * @brief 向上转发结果
     */
    void slotResult();

signals:
    /**
     * @brief 执行请求
     * @param url 请求地址
     * @param arg 请求参数
     */
    void sigPostHttpRequest(const QString &url, const QJsonObject &obj);

private:
    //工作类、线程
    HttpWorker *m_pWorker = nullptr;
    QThread m_thread;

    //请求url以及参数值
    QString m_serverIP;
    QString m_url;
    QString m_arg;
};

#endif // HTTPCONTROLLER_H

实现文件

cpp 复制代码
#include "httpcontroller.h"


HttpWorker::HttpWorker()
{
    m_pManager = new QNetworkAccessManager(this);
}

HttpWorker::~HttpWorker()
{
    if(m_pManager != nullptr)
    {
        delete m_pManager;
        m_pManager = nullptr;
    }
}

void HttpWorker::dealXXInfo(const QJsonObject &object)
{

}

void HttpWorker::slotPostHttpRequest(const QString &url, const QJsonObject &obj)
{
    QJsonDocument jsonDoc = QJsonDocument(obj);
    QByteArray argInfo = jsonDoc.toJson(QJsonDocument::Compact);
    qDebug() << "post HttpRequest" << url << argInfo;

    QNetworkRequest request;
    request.setUrl(QUrl(url));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    request.setHeader(QNetworkRequest::ContentLengthHeader, argInfo.length());

    QNetworkReply *reply = m_pManager->post(request, argInfo);
    connect(reply, &QNetworkReply::readyRead, this, &HttpWorker::slotReadyRead);
    connect(reply, &QNetworkReply::finished, this, &HttpWorker::slotReplyFinished);

}

void HttpWorker::slotReadyRead()
{

}

void HttpWorker::slotReplyFinished()
{
    QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
    if(reply == nullptr)
    {
        qDebug() << "replyFinished Reply nullptr";
        return;
    }

    QByteArray byteArray = reply->readAll();
    if(byteArray.isEmpty())
    {
        qDebug() << "replyFinished ByteArray empty";
        return;
    }

    //处理最终数据
    slotRecvData(byteArray);

    //清理资源
    reply->deleteLater();
}

void HttpWorker::slotRecvData(const QByteArray &recvBuffer)
{
    QJsonParseError jsonerror;
    QJsonDocument doc = QJsonDocument::fromJson(recvBuffer, &jsonerror);
    if (doc.isNull() || jsonerror.error != QJsonParseError::NoError)
    {
        QString info(recvBuffer);
        if(!info.isEmpty())
        {
            qDebug() << "recvData parseJson error" << jsonerror.errorString() << info;
        }

        return;
    }

    //解析json数据
    QJsonObject object = doc.object();
    QString cmd = object.value("cmd").toString();
    QJsonObject paramObj = object.value("param").toObject();

    //进行业务分发
    if("timeSetWeb" == cmd)
    {
        dealXXInfo(object);
    }
    else if("timeSetWeb" == cmd)
    {

    }
}


HttpController::HttpController(QObject *parent) : QObject(parent)
{
    //请求url
    m_serverIP = "192.168.25.111";
    m_url = m_serverIP + "/api/XX";

    m_pWorker = new HttpWorker();
    m_pWorker->moveToThread(&m_thread);

    connect(&m_thread, &QThread::finished, this,&HttpController::slotExitThread);
    connect(this, &HttpController::sigPostHttpRequest, m_pWorker, &HttpWorker::slotPostHttpRequest);
    connect(m_pWorker, &HttpWorker::sigResult, this, &HttpController::slotResult);

    m_thread.start();
}

HttpController::~HttpController()
{
    if(m_pWorker)
    {
        delete m_pWorker;
        m_pWorker = nullptr;
    }

    slotExitThread();
}

void HttpController::setDateTimeInfo(const QDateTime &datetime)
{
    //封装信息
    QJsonObject obj;
    obj.insert("cmd", "timeSetWeb");
    QJsonObject param;
    param.insert("token", 0);
    param.insert("dateformat", 0);
    param.insert("timeformat", 1);
    param.insert("manually", 0);
    param.insert("year", datetime.date().year());
    param.insert("month", datetime.date().month());
    param.insert("day", datetime.date().day());
    param.insert("hour", datetime.time().hour());
    param.insert("minute", datetime.time().minute());
    param.insert("second", datetime.time().second());
    obj.insert("param", param);

    emit sigPostHttpRequest(m_url, obj);
}

void HttpController::slotExitThread()
{
    m_thread.quit();
    m_thread.wait();
}

void HttpController::slotResult()
{

}
相关推荐
nashane5 小时前
HarmonyOS 6学习:旋转动画优化与长截图性能调优——打造丝滑交互体验的深度实践
学习·交互·harmonyos·harmonyos 5
机器视觉知识推荐、就业指导6 小时前
Qt:真正的门槛不是入门,而是维护
开发语言·qt
米优7 小时前
qgis电子地图二次开发---比例尺
qt·qgis
ZC跨境爬虫11 小时前
UI前端美化技能提升日志day7:(原生苹方字体全局适配+合规页脚完整像素级落地)
前端·javascript·ui·html·交互
雾岛听蓝11 小时前
Qt操作指南:状态栏、浮动窗口与对话框使用
开发语言·经验分享·笔记·qt
_Evan_Yao11 小时前
对话的边界:HTTP 的克制,SSE 的流淌,WebSocket 的自由
java·后端·websocket·网络协议·http
楚Y6同学13 小时前
QT C++之保存界面设置为配置文件
c++·qt·保存配置
Ulyanov13 小时前
《PySide6 GUI开发指南:QML核心与实践》 第十篇:综合实战——构建完整的跨平台个人管理应用
开发语言·python·qt·ui·交互·qml·雷达电子战系统仿真
-凌凌漆-14 小时前
【QML】QQmlEngine::setObjectOwnership()的作用
qt
Ulyanov16 小时前
《PySide6 GUI开发指南:QML核心与实践》 第八篇:性能优化大师——QML应用性能调优实战
python·qt·ui·性能优化·qml·系统仿真