Qt + HTTP 线程交互类封装

这篇具有很好参考价值的文章主要介绍了Qt + HTTP 线程交互类封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

QT的HTTP模块封装的交互类,线程运行。使用时添加自己的业务逻辑即可文章来源地址https://www.toymoban.com/news/detail-852531.html

代码

头文件

/**
 * @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

实现文件

#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()
{

}

到了这里,关于Qt + HTTP 线程交互类封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 14-5_Qt 5.9 C++开发指南_基于HTTP 协议的网络应用程序

    Qt 网络模块提供一些类实现 OSI 7 层网络模型中高层的网络协议,如 HTTP、FTP、SNMP等,这些类主要是 QNetworkRequest、QNetworkReply和QNetworkAccessManager。 QNetworkRequest 类通过一个URL 地址发起网络协议请求,也保存网络请求的信息,目前支持 HTTP、FTP 和局部文件 URLs的下载或上传。 QNe

    2024年02月13日
    浏览(51)
  • Qt+QtWebApp开发笔记(二):http服务器日志系统介绍、添加日志系统至Demo测试

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130762721 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《Qt+QtWebApp开发笔记(一

    2024年02月05日
    浏览(38)
  • Qt+QtWebApp开发笔记(四):http服务器使用Session和Cookie实现用户密码登录和注销功能

      前面实现了基础的跳转,那么动态交互中登录是常用功能。   本篇实现一个动态交互的简单登录和注销功能,在Qt中使用Session和Cookie技术。        链接:https://pan.baidu.com/s/1nkmsHgr-11Khe9k6Ntyf_g?pwd=1234     Web应用程序通常处理用户输入。将开发一个登录表单,看看

    2024年02月06日
    浏览(86)
  • Qt+QtWebApp开发笔记(六):http服务器html实现静态相对路径调用第三方js文件

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131244269 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《Qt+QtWebApp开发笔记(五

    2024年02月13日
    浏览(53)
  • 【QT】——QT中HTTP通信的使用流程

    目录 基本概念 1.QNetworkAccessManager 常用的公共成员函数 信号  2.QNetworkRequest ——HTTP请求 3.QNetworkReply——HTTP响应 HTTP通信流程 Qt中的HTTP通信访问 API 是围绕 QNetworkAccessManager 对象构建的, 该对象保存它发送的请求的通用配置和设置 ,一个 QNetworkAccessManager 实例应该足以满足整

    2024年02月15日
    浏览(30)
  • Qt下载http文件

    这是一个有问题的版本:  当要下载的文件过大时,程序会崩溃!!!(std::bad_alloc)(所以只可以下载一些小的文件) 我认为这是ba(QByteArray)太大了,要一下子往文件中写入太多的数据,导致new失败了。 修复: Qt 基于http的网络文件下载_qt http下载文件-CSDN博客(参考+引用)

    2024年01月18日
    浏览(32)
  • Qt中的HTTP

    HTTP是一种超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议,是浏览器端Web通信的基础。 B/S架构:Browser/Server,浏览器/服务器架构。 C/S架构:Client/Server,客户端/服务端架构。 B/S架构相对于C/S架构,客户机上无需安装任何软件,使用浏览器即可访

    2024年02月07日
    浏览(30)
  • QT Http协议

    本篇文章来给大家讲解QT中的Http协议,Http协议主要用于网络中数据的请求和响应,那么这篇文章将给大家讲解一下这个协议。 HTTP(超文本传输协议)是互联网上应用最为广泛的协议之一,它定义了客户端和服务器之间进行通信的规则。HTTP是一种无状态的协议,它通过请求

    2024年02月15日
    浏览(40)
  • QT之Http请求

    今天我们介绍一下QT的http请求,这里有post和get两种方式 一、post请求方式:参数分为网址和具体请求值两个部分,有时候还需要设置头信息,看具体情况定 二、get请求方式:参数和网址拼接到一起请求 三、主要区别: get用于请求获取数据,post向指定的资源创建修改数据 g

    2024年02月15日
    浏览(40)
  • Qt中运用HTTP协议

    在使用Qt框架进行应用开发的过程中,很多时候需要进行客户端与服务端的网络通信,这时候就需要Qt的internet模块。而网络通信中最常用的协议就是http协议,Qt对http协议的调用进行了封装,使用非常方便。这里对常用的http请求demo做一下总结,方便大家参考。 在使用internet模

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包