QT之HTTP的post请求+超时机制+json解析
·
QT之HTTP的post请求+超时机制+json解析
最近项目用到了QT的HTTP的相关操作,主要是post请求,和收到数据后的json解析。另外还加入了超时的机制。
代码贴出来,供大家参考。
1、首先在.pro文件中加入下面这句话,因为使用网络相关功能必须加上
QT += network
2、然后是头文件:
#ifndef TEST_H
#define TEST_H
class TEST
{
public:
TEST();
void Post_Request();
};
#endif // TEST_H
3、源文件
#include "test.h"
#include <QHttpPart>
#include <QNetworkRequest>
#include "qnetworkreply.h"
#include <qnetworkaccessmanager.h>
#include <qeventloop.h>
#include <QTimer>
#include <QTextCodec>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonValue>
TEST::TEST()
{
}
void TEST::Post_Request()
{
QString baseUrl = "http://192.168.6.31:20000/PostRequest";//请求的网址
//参数1:
QString Part1_value = "Part1_value";//值1
QHttpPart Part1;
Part1.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"Part1\";"));//添加参数名 Part1
Part1.setBody(Part1_value.toUtf8());//添加参数值1
//参数2:
QString Part2_value = "Part2_value";//值2
QHttpPart Part2;
Part2.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"Part2\";"));//添加参数名 Part2
Part2.setBody(Part2_value.toUtf8());//添加参数值2
QNetworkRequest request;
request.setUrl(baseUrl);
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
multiPart->append(Part1);
multiPart->append(Part2);
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkReply *reply=manager->post(request,multiPart);//发送数据,返回结果
//添加事件循环机制,返回后再运行后面的
QEventLoop eventLoop;
QTimer timer;//开启一个定时器,用于超时处理
timer.setInterval(3000);//设置超时时间,单位ms
timer.setSingleShot(true);//设置为只触发一次
connect(&timer,SIGNAL(timeout()), &eventLoop, SLOT(quit()));
connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
timer.start();//启动定时器
eventLoop.exec(); //阻塞模式直到完成
/* 处理响应 */
if (timer.isActive()) {//定时器仍在运行,说明没超时
QString ID;
QString DATE;
QString message;
if (reply->error() == QNetworkReply::NoError)//无错误
{
qDebug() << "NoError";
//请求收到的结果
QByteArray responseByte = reply->readAll();//读取
QTextCodec *codec = QTextCodec::codecForName("utf8");
QString str = codec->toUnicode(responseByte);//格式转换
QJsonDocument document;
QJsonParseError ParseError;
document =QJsonDocument::fromJson(str.toUtf8(),&ParseError);//json解析
if(!document.isNull() && ParseError.error == QJsonParseError::NoError)//解析成功且不为空
{
if(document.isObject())//判断是否是对象
{
QJsonObject Object = document.object(); //获取文档对象
if(!Object.isEmpty())//是否为空
{
if(Object.contains("msg"))//成员解析
{
QJsonValue msg = Object.value("msg");
if(msg.isString())
{
message = msg.toString();
}
}
if(Object.contains("id"))
{
QJsonValue id = Object.value("id");
if(id.isString())
{
ID = id.toString();
}
}
if(Object.contains("date"))
{
QJsonValue date = Object.value("date");
if(date.isString())
{
DATE = date.toString();
}
}
}
//下面添加对解析到的数据进行处理
}
}
}
else
{
qDebug()<<"request protobufHttp handle errors here";
//statusCodeV是HTTP服务器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档
QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
qDebug( "request protobufHttp found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
qDebug(qPrintable(reply->errorString()));
}
}
else {
disconnect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
reply->abort();//终止操作并关闭连接
qDebug("time out");
}
reply->deleteLater();//删除对象
}
以上就是QT的post请求的全部操作,代码中特别添加了定时器,用于发送或响应超时情况下的处理。
如果觉得这篇文章对您有帮助,欢迎点赞、评论、转发、收藏!您的支持是我创作的最大动力!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)