介绍
QT的HTTP模块封装的交互类,线程运行。使用时添加自己的业务逻辑即可
代码
头文件
/**
* @file httpcontroller.h
* @brief 云台相机的协议交互类
* @author xintong-zhou
* @date 2024-03-13
*/
#ifndef HTTPCONTROLLER_H
#define HTTPCONTROLLER_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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_castQNetworkReply *>(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();
}
v服务器托管网oid 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()
{
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 向爬虫而生—Redis 探究篇8<保障缓存和持久化数据一致性的研究与实现(初) `探索篇`>
前言: 随着我们的生活越来越数字化,我们对数据的依赖变得无所不在。无论是在购物网站上浏览商品、在社交媒体上与朋友互动,还是在工作中处理大量的业务数据,数据都成了我们生活的重要组成部分。 当我们使用应用程序或网站时,我服务器托管网们希望能够获得快速、即时的响应。…