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

Qt使用http发送与解析json数据二(使用Qt网络编程API调用post、get方法)———附送完整源代码

文章目录

  • 0 背景
  • 1 Http网络管理类
    • 1.1 创建管理类
    • 1.2 使用管理类
  • 2 发送json数据
  • 3 解析json数据
  • 4 好用的调试软件与网址
    • 4.1 应用
    • 4.2 网页
  • 附赠

0 背景

因为项目要用到许多的post请求,因此查询了大量资料加上自己的实践,最后总结出了此文。之前也写过相同主题的文章,不过方法比较麻烦,需要通过调用json格式的数据来进行post请求,此文正是上文的优化。

后记:因为需要进行http的get请求,故现在补上get请求的方法。

1 Http网络管理类

1.1 创建管理类

在pro文件中,加入

QT+=network # 网络

.h

#ifndefHTTPNETWORKREQUEST_H#defineHTTPNETWORKREQUEST_H#include<QNetworkAccessManager>#include<QNetworkRequest>#include<QString>#include<QObject>#include<QJsonObject>#include<QByteArray>classHttpNetworkRequest:publicQObject{Q_OBJECTpublic:HttpNetworkRequest();~HttpNetworkRequest();private://执行的post类型intm_executePostRequestType=0;//解析的post类型intm_analysisPostRequestType=0;private://post请求状态enumPostStatus{SucceedDeal=0,//成功处理ServerMaintenanceError=1,//服务器维护状态SeverDisconnectError=2,//断网状态NoPermissionError=3,//没有权限DataAbnormalError=4,//json数据异常错误DealDatabaseError=5//处理数据库异常错误};//请求的ip头QString m_requestIPHead="http://192.168.0.123:8080";//执行http请求enumExecuteHttpRequestType{TestPostOperate=0,TestGetOperate=1,};//得到消息头的tokenQString m_accessToken;//发送网络请求和接受应答QNetworkAccessManager*m_networkAccessManager;//请求的消息题QNetworkRequest m_httpRequest;//发送data数据QByteArray m_sendJsonData;/**************请求**********************//** * @brief 测试post请求 */voidtestHttpRequestPost();/** * @brief 测试get请求 */voidtestHttpRequestGet();/**************处理**********************//** * @brief 处理服务器状态请求 * @param jsonObject */booldealTestRequest(QJsonObject&jsonObject);voidparseJsonData(constQByteArray&data);privateslots:/** * @brief 处理post请求发回的数据的总接口 * @param reply */voiddealNetworkFinisheded(QNetworkReply*reply);//调用唯一接口publicslots:/** * @brief 接收Http请求操作 */voidreceiveHttpRequestType(intinstruct,constQByteArray&content="");signals:/** * @brief 处理数据的结果 * @param type:界面类型 * 处理回传参数post,各种异常 */voidsendDealDataResult(intresult,inttype);};#endif// HTTPNETWORKREQUEST_H

.cpp

#include"httpnetworkrequest.h"#include<QJsonObject>#include<QJsonDocument>#include<QJsonArray>#include<QNetworkReply>#include<QDebug>#include<QVector>#include<QDateTime>#include<QUrlQuery>/* 消息同步逻辑: receivePostRequestType(接收执行消息类型)-->workModeQueryRequestPost(进行工作状态查询)【sendServerMaintainStatus信号】 --->accessTokenHttpRequestPost--->dealTokenReques(根据m_executePostRequestType类型不同,执行不同业务操作) */HttpNetworkRequest::HttpNetworkRequest(){m_networkAccessManager=newQNetworkAccessManager();//处理所有post请求connect(m_networkAccessManager,&QNetworkAccessManager::finished,this,&HttpNetworkRequest::dealNetworkFinisheded);}HttpNetworkRequest::~HttpNetworkRequest(){qDebug()<<"HttpNetworkRequest";deletem_networkAccessManager;}//发送post请求voidHttpNetworkRequest::testHttpRequestPost(){qDebug()<<"testHttpRequestPost";//要发送的json数据// QJsonObject obj;// obj.insert("username", "root");// obj.insert("password", "password");// QJsonDocument jsonDoc(obj);//QJsonObject转QJsonDocument// QString str = QString(jsonDoc.toJson());//QJsonDocument转QString// QByteArray content = str.toUtf8();// qDebug()<<"m_sendJsonData:"<<m_sendJsonData;m_httpRequest.setUrl(QUrl(m_requestIPHead+"/api/login"));m_httpRequest.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");// m_httpRequest.setRawHeader("access_token", m_accessToken.toUtf8());m_httpRequest.setHeader(QNetworkRequest::ContentLengthHeader,m_sendJsonData.length());m_analysisPostRequestType=ExecuteHttpRequestType::TestPostOperate;// 发送参数m_networkAccessManager->post(m_httpRequest,m_sendJsonData);}//发送get请求voidHttpNetworkRequest::testHttpRequestGet(){qDebug()<<"testHttpRequestGet()";QUrl fullUrl=m_requestIPHead+"/api/factoryDevice/getDeviceId";// QHash<QString, QString> params;// params["ip"] = "192.168.0.123";// QUrlQuery query;// for (auto it = params.begin(); it != params.end(); ++it) {// query.addQueryItem(it.key(), it.value());// }// fullUrl.setQuery(query);//拼接urlQUrl url=QUrl::fromEncoded(m_sendJsonData);fullUrl=fullUrl.resolved(url);//设置tokenm_accessToken="Bearer sample-jwt-token-1765004347293";qDebug()<<"fullUrl:"<<fullUrl;m_httpRequest.setUrl(fullUrl);m_httpRequest.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");m_httpRequest.setRawHeader("Authorization",m_accessToken.toUtf8());//设置token//m_httpRequest.setHeader(QNetworkRequest::ContentLengthHeader, m_sendJsonData.length());m_analysisPostRequestType=ExecuteHttpRequestType::TestGetOperate;// 发送参数m_networkAccessManager->get(m_httpRequest);}//处理http请求boolHttpNetworkRequest::dealTestRequest(QJsonObject&jsonObject){qDebug()<<"dealTestRequest:"<<jsonObject;if(jsonObject.contains("code")){if(jsonObject.value("code").toInt()==200){//发送处理结果emitsendDealDataResult(PostStatus::SucceedDeal,m_executePostRequestType);returntrue;}else{emitsendDealDataResult(PostStatus::DataAbnormalError,m_executePostRequestType);returnfalse;}}else{emitsendDealDataResult(PostStatus::DealDatabaseError,m_executePostRequestType);returnfalse;}}voidHttpNetworkRequest::parseJsonData(constQByteArray&data){// 创建JSON解析错误对象QJsonParseError jsonError;// 将字节数据解析为JSON文档QJsonDocument jsonDoc=QJsonDocument::fromJson(data,&jsonError);qDebug()<<"parseJsonData:"<<data;qDebug()<<"document.isNull():"<<jsonDoc.isNull();if(jsonError.error==QJsonParseError::NoError&&!jsonDoc.isNull()){qDebug()<<"解析未发生错误";qDebug()<<"JSON 文档为对象";QJsonObject object=jsonDoc.object();// 转化为对象if(jsonDoc.isObject()){switch(m_analysisPostRequestType){caseExecuteHttpRequestType::TestPostOperate:dealTestRequest(object);break;caseExecuteHttpRequestType::TestGetOperate:dealTestRequest(object);break;default:break;}}else{emitsendDealDataResult(PostStatus::DealDatabaseError,m_executePostRequestType);}}else{if(jsonDoc.isNull()==true){qDebug()<<"document.isNull:";emitsendDealDataResult(PostStatus::DataAbnormalError,m_executePostRequestType);}elseif(jsonError.error==QJsonParseError::NoError){qDebug()<<"jsonError.error:"+jsonError.errorString();emitsendDealDataResult(PostStatus::DataAbnormalError,m_executePostRequestType);}}}//post处理总入口voidHttpNetworkRequest::dealNetworkFinisheded(QNetworkReply*reply){// if(QSslSocket::supportsSsl() == true){// qDebug()<<"支持SSL:"<<QSslSocket::sslLibraryBuildVersionString() + QSslSocket::sslLibraryVersionString();// }else{// qDebug()<<"不支持SSL:"<<QSslSocket::sslLibraryBuildVersionString() + QSslSocket::sslLibraryVersionString();// }if(reply->error()==QNetworkReply::NoError){// 读取响应数据QByteArray data=reply->readAll();// 开始解析JSON数据parseJsonData(data);}else{qDebug()<<"请求失败:"<<reply->errorString();qDebug()<<"HTTP status:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();qDebug()<<"reply->error():"<<reply->error();// 特别检查UnknownNetworkErrorif(reply->error()==QNetworkReply::UnknownNetworkError){qDebug()<<"可能原因:网络资源竞争或Qt内部状态问题";}emitsendDealDataResult(PostStatus::SeverDisconnectError,m_executePostRequestType);}//删除对象qDebug()<<"reply->deleteLater()";reply->deleteLater();//功能:刷新QNetworkAccessManager内部的身份验证数据和网络连接缓存,不会清除DNS或网络数据缓存// m_networkAccessManager->clearAccessCache();//功能:刷新网络连接的内部缓存,但保留身份验证数据m_networkAccessManager->clearConnectionCache();}//类接口voidHttpNetworkRequest::receiveHttpRequestType(intinstruct,constQByteArray&content){//获得执行的指令m_executePostRequestType=instruct;//获得发送的内容m_sendJsonData=content;switch(m_executePostRequestType){caseExecuteHttpRequestType::TestPostOperate:testHttpRequestPost();break;caseExecuteHttpRequestType::TestGetOperate:testHttpRequestGet();break;default:break;}}

1.2 使用管理类

在类中加入http管理类的成员:

#ifndefMAININTERFACE_H#defineMAININTERFACE_H#include<QMainWindow>#include"httpnetworkrequest.h"QT_BEGIN_NAMESPACEnamespaceUi{classMainInterface;}QT_END_NAMESPACEclassMainInterface:publicQMainWindow{Q_OBJECTpublic:MainInterface(QWidget*parent=nullptr);~MainInterface();private:Ui::MainInterface*ui;private://执行的http类型enumExecuteHttpRequestType{TestPostOperate,TestGetOperate,};//http请求HttpNetworkRequest*m_httpNetworkRequest;voidtestPost();voidtestGet();};#endif// MAININTERFACE_H

.cpp

调用方法:

#include"maininterface.h"#include"ui_maininterface.h"#include<QJsonDocument>MainInterface::MainInterface(QWidget*parent):QMainWindow(parent),ui(newUi::MainInterface){ui->setupUi(this);//创建对象m_httpNetworkRequest=newHttpNetworkRequest;testPost();testGet();}MainInterface::~MainInterface(){//销毁对象deletem_httpNetworkRequest;deleteui;}voidMainInterface::testPost(){//要发送的json数据QJsonObject obj;obj.insert("username","admin");obj.insert("password","admin");QJsonDocumentjsonDoc(obj);//QJsonObject转QJsonDocumentQString str=QString(jsonDoc.toJson());//QJsonDocument转QStringQByteArray content=str.toUtf8();//发送post请求m_httpNetworkRequest->receiveHttpRequestType(ExecuteHttpRequestType::TestPostOperate,content);}voidMainInterface::testGet(){QHash<QString,QString>params;params["ip"]="192.168.0.123";QUrlQuery query;//用于处理URL查询字符串的类(能自动处理编码和特殊字符)for(autoit=params.begin();it!=params.end();++it){query.addQueryItem(it.key(),it.value());}QUrl partUrl;partUrl.setQuery(query);QString str=partUrl.toString();QByteArray content=str.toUtf8();//发送post请求m_httpNetworkRequest->receiveHttpRequestType(ExecuteHttpRequestType::TestGetOperate,content);}

2 发送json数据

例如下面的数据:

方法:

//要发送的json数据QJsonObject sendJsonData;sendJsonData.insert("code",200);//加入arrayQJsonArray arry;QJsonObject tempObject1;tempObject1.insert("name","小明");tempObject1.insert("height",180);tempObject1.insert("weight",70.3);arry.append(tempObject1);QJsonObject tempObject2;tempObject2.insert("name","小花");tempObject2.insert("height",165);tempObject2.insert("weight",45.8);arry.append(tempObject2);sendJsonData.insert("people",QJsonValue(arry));//加入objectQJsonObject tempObject;tempObject.insert("school","Carnegie Mellon University");tempObject.insert("location","PIT");sendJsonData.insert("affiliation",QJsonValue(tempObject));m_jsonData=sendJsonData;//m_jsonData为类成员变量,类型为QJsonObjectqDebug()<<"sendJsonData:"<<sendJsonData;

处理post返回的结果:

//处理post返回的结果connect(m_httpNetworkRequest,&HttpNetworkRequest::sendDealDataResult,this,[&](intresult,inttype){});

3 解析json数据

例如解析上面的示例中的json数据:

//解析codeif(m_jsonData.contains("code")){qDebug()<<"code:"<<m_jsonData.value("code").toInt();}//解析arrayif(m_jsonData.contains("people")){QJsonValue peopleObject=m_jsonData.take("people");if(peopleObject.isArray()){QJsonArray peopleArray=peopleObject.toArray();for(inti=0;i<peopleArray.size();++i){QJsonValue value=peopleArray.at(i);qDebug()<<"name:"<<value["name"].toString();qDebug()<<"height:"<<value["height"].toInt();qDebug()<<"weight:"<<value["weight"].toDouble();}}}//解析obectif(m_jsonData.contains("affiliation")){QJsonValue affiliationValue=m_jsonData.value("affiliation");QJsonObject affiliationObject=affiliationValue.toObject();if(affiliationObject.contains("school")){qDebug()<<"school:"<<affiliationObject.value("school").toString();qDebug()<<"location:"<<affiliationObject["location"].toString();}}

4 好用的调试软件与网址

4.1 应用

1,Apifox
介绍:Apifox = Postman + Swagger + Mock + JMeter

2,Postman

4.2 网页

1, json数据解析

2,JSONPath

附赠

github
码云地址
csdn资源(有积分的可以支持一下,谢谢)

http://www.jsqmd.com/news/698256/

相关文章:

  • HEIF Utility:打破Windows平台HEIF图片兼容壁垒的免费利器
  • 全方位解析百联OK卡回收平台,让你的卡不再闲置 - 团团收购物卡回收
  • 从Civitai与HuggingFace看AIGC模型生态:技术普惠、内容边界与本土化挑战
  • 2026年甘肃性价比高的KBSG矿用隔爆型负荷中心用干式变压器厂家排名 - 工业品牌热点
  • 别再硬编码了!用FlexSim脚本函数动态处理‘多品种小批量’订单组合
  • 从零到一:在CentOS 7上实战部署若依前后端分离项目(ruoyi-vue)全流程解析
  • 图像篡改检测的“火眼金睛”是如何炼成的?深入浅出解读MVSS-Net的多视图与多尺度设计
  • 2026年珠三角海运与多式联运全链路方案对比指南:找到最稳妥的货代伙伴 - 企业名录优选推荐
  • AltSnap:让Windows窗口管理像Linux一样高效
  • Python ERA5 水汽通量散度图实战:从数据下载到SCI级地图绘制的完整流程
  • 如何通过Pomotroid实现高效时间管理:番茄工作法新手指南
  • HarmonyOS在金融嵌入式设备中的应用开发实践:从入门到精通
  • 解决研发打样难:苏州支持“1件起订”的精密零件加工厂 - 莱图加精密零件加工
  • 分析2026年多层超声波三次元旋振筛生产厂家,如何选择? - myqiye
  • Open XML SDK完全指南:如何高效处理Office文档自动化
  • 虚拟机安装AlmaLinux 9.x及其常用软件(2026.3)
  • 2026年口碑好的人员外包公司推荐,江苏、广州等地专业机构全解析 - 工业推荐榜
  • 如何使用Awesome-Diffusion-Model-Based-Image-Editing-Methods:完整的扩散模型图像编辑指南
  • 告别数据预处理焦虑:UAVid 4K街景数据集的高效加载与增强技巧(附PyTorch代码)
  • supplier_schema.py
  • Arthas增强版athas:Java线上诊断工具的一键部署与生产级实践
  • AI智能体工程化:从模式到技能的构建与编排实践
  • Qsign终极实战指南:3步构建高性能QQ签名API服务架构
  • 终极MCP服务器:构建AI工具调用的标准化协议与生产级实践
  • 7-Zip深度解析:突破性压缩技术如何重塑文件管理效率
  • 2026年洛阳商务宴请与商务聚餐完全指南:诱江南江浙菜高端定制避坑手册 - 年度推荐企业名录
  • Graph WaveNet数据加载与预处理全解析:从.pkl邻接矩阵到标准化DataLoader
  • 快速回收百联OK卡,这些平台让你秒变回收达人 - 团团收购物卡回收
  • 仅用32KB RAM运行Qwen-0.5B?:20年嵌入式老兵逆向拆解模型蒸馏+INT4权重重映射+汇编级Cache预取的极限压缩术
  • 【简单】判断一个数是否是回文数-Java