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资源(有积分的可以支持一下,谢谢)
