Qt使用http协议进行post数据
使用Qt进行post数据
近段时间项目遇到使用http协议进行post请求,简单逻辑就是post一段请求到url,等待url回复,若一定时间内没有受到回复则按超时处理。这里直接上post相关代码以及阻塞处理消息的相关代码。
先加上Qt相关的头文件
#include <QJsonObject>
#include <QtNetwork>
#include <QByteArray>
需要创建的相关成员变量有:
QNetworkAccessManager* m_httpManager;
QNetworkReply * m_httpReply;
QNetworkRequest m_httpRequest;
QByteArray m_httpData;
QJsonDocument m_httpDocum;
下面介绍下封装的一段接口函数
bool _ret; // 返回结果
QJsonObject _exampleObject;
_exampleObject.insert("key1", value1);
_exampleObject.insert("key2", value2);
_exampleObject.insert("key3", value3);
_exampleObject.insert("key4", value4);
//post请求的数据是Json格式。首先创建QJsonObject对象,并插入数据。
m_httpDocum.setObject(_exampleObject);
m_httpData = m_httpDocum.toJson(QJsonDocument::Compact);
// 转成Json格式
QUrl _url("url");
m_httpRequest.setUrl(_url);
// 设置请求的url 注意地址的正确性 之前我就受到了http和https的坑
m_httpRequest.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
// 设置请求头
m_httpReply = m_httpManager->post(m_httpRequest, m_httpData);
// post请求
QEventLoop _loop;
QTimer _timer;
connect(m_httpReply, SIGNAL(finished()), &_loop, SLOT(quit()));
connect(&_timer, SIGNAL(timeout()), &_loop, SLOT(quit()));
// eventloop用于阻塞等待消息,并结合timer进行超时处理
_timer.start(1000);
_loop.exec();
// 这里的eventloop只是阻塞此段,并不会阻塞其他块的代码,比如我不加定时器,让这个eventloop一直exec,还是可以出发相关的槽函数
if(_timer.isActive())
{
_timer.stop();
_ret = httpHandleData();
// 处理函数
}
else
{
qDebug() << "time Out";
//超时结果
}
_loop.deleteLater();
_timer.deleteLater();
// 释放资源
m_httpReply->abort();
// 断开连接
return _ret;