当前位置: 首页 > news >正文

【Qt】使用Qt发送http请求封装一个通用类

需求

Qt 代码中使用QNetworkRequest、QNetworkReply进行http请求,能不能整理成一个通用的方法或者类。

实现

HttpClient类

#include <QObject>  
#include <QNetworkAccessManager>  
#include <QNetworkRequest>  
#include <QNetworkReply>  
#include <QUrl>  
#include <QUrlQuery>  
#include <QByteArray>  
#include <QJsonObject>  
#include <QJsonDocument>  
#include <QDebug>  
#include <QEventLoop>class HttpClient : public QObject  
{  Q_OBJECT  public:  explicit HttpClient(QObject *parent = nullptr)  : QObject(parent), networkManager(new QNetworkAccessManager(this))  {  connect(networkManager, &QNetworkAccessManager::finished, this, &HttpClient::onReplyFinished);  }  void get(const QUrl &url, const QUrlQuery &query = QUrlQuery())  {  QUrl fullUrl = url;  fullUrl.setQuery(query);  QNetworkRequest request(fullUrl);  networkManager->get(request);  eventLoot->exec();}  void post(const QUrl &url, const QByteArray &data)  {  QNetworkRequest request(url);  request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");  networkManager->post(request, data); eventLoot->exec(); }  signals:  void requestFinished(const QByteArray &responseData, QNetworkReply::NetworkError error);  private slots:  void onReplyFinished(QNetworkReply *reply)  {  if (reply->error() == QNetworkReply::NoError) {  QByteArray responseData = reply->readAll();  emit requestFinished(responseData, QNetworkReply::NoError);  } else {  emit requestFinished(QByteArray(), reply->error());  }  reply->deleteLater();  }  private:  QNetworkAccessManager *networkManager;  QEventLoop eventLoop;
};

HttpClient中使用了一个QEventLoop,为了使发送的事件得到及时的处理,不加这个的话,测试发现半天都不能调到onReplyFinished槽函数中。

使用

#include <QCoreApplication>  
#include <QUrl>  
#include <QUrlQuery>  
#include <QJsonDocument>  
#include <QJsonObject>  
#include <QByteArray>  
#include "HttpClient.h"  int main(int argc, char *argv[])  
{  QCoreApplication a(argc, argv);  HttpClient client;  // 发送GET请求  QUrl getUrl("https://jsonplaceholder.typicode.com/posts/1");  QObject::connect(&client, &HttpClient::requestFinished, [](const QByteArray &responseData, QNetworkReply::NetworkError error) {  if (error == QNetworkReply::NoError) {  QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData);  QJsonObject jsonObj = jsonDoc.object();  qDebug() << "GET Response:" << jsonObj;  } else {  qDebug() << "GET Error:" << error;  }  });  client.get(getUrl);  // 发送POST请求  QUrl postUrl("https://jsonplaceholder.typicode.com/posts");  QJsonObject postData;  postData["title"] = "foo";  postData["body"] = "bar";  postData["userId"] = 1;  QByteArray postDataBytes = QJsonDocument(postData).toJson();  QObject::connect(&client, &HttpClient::requestFinished, [](const QByteArray &responseData, QNetworkReply::NetworkError error) {  if (error == QNetworkReply::NoError) {  QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData);  QJsonObject jsonObj = jsonDoc.object();  qDebug() << "POST Response:" << jsonObj;  } else {  qDebug() << "POST Error:" << error;  }  });  client.post(postUrl, postDataBytes);  return a.exec();  
}


http://www.mrgr.cn/news/66265.html

相关文章:

  • k8s 查看cpu使用率最高的pod
  • YOLO即插即用---CLFT
  • Spring 框架中常见的注解(Spring、SpringMVC、SpringBoot)
  • json和pb的比较
  • proxypin抓包快速补axios环境
  • D58【python 接口自动化学习】- python基础之异常
  • 劫持微信聊天记录并分析还原 —— 解密数据库(二)
  • 工作中问题
  • 新一代跟踪器StrongSORT: Make DeepSORT Great Again论文解析—让 DeepSORT 再次伟大
  • nacos本地虚拟机搭建切换wiff问题
  • 基于SpringBoot的免税商品优选购物商城的设计与实现
  • 小美和大富翁
  • 动态规划 —— dp问题-按摩师
  • Docker 的基本概念和优势
  • 气体传感器种类详解:从半导体到红外吸收型的全面解析
  • 仿真APP助力汽车零部件厂商打造核心竞争力
  • 解决从huggingface.co下载模型失败问题
  • EasyQBlog .NET 8 + Q-Blog 2.0博客模板 + easyweb iframe后台模板 开发的个人博客
  • 树莓派开发相关知识十 -小车服务器
  • Python打包脚本为EXE可执行文件
  • 信息安全工程师(77)常见网络安全应急事件场景与处理流程
  • 基于SSD模型的行人跌倒、摔倒检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】
  • segformer模型实现pcb缺陷检测
  • DMRl-Former用于工业过程预测建模和关键样本分析的数据模式相关可解释Transformer网络
  • vos3000外呼系统如何检查落地网关配置正常,路由分析
  • 为什么学习Mybatis框架