文章目录
- 前言
- Code
- 完整code
- 效果
- 循环loop的使用
- 讲解
- 配置
- 相关对象
- Https
- END
前言
http的操作是网络通信中非常常见的操作,其中广泛使用get,post两种操作。
本文将对Qt中,http的get请求做简单应用,来进行展示。
Code
完整code
#include <QApplication>
#include <QDebug>
#include <QJsonDocument>
#include <QNetworkAccessManager>
#include <QNetworkReply>
namespace {
/**
* @brief receive_getReply
* @param reply
* 处理回答
*/
void receive_getReply(QNetworkReply *reply) {
if (nullptr == reply) {
qDebug() << "reply nullptr";
return;
}
/// 等待结束后再read
QObject::connect(reply, &QNetworkReply::finished, [reply]() {
/// read data
QByteArray byte = reply->readAll();
// reply->disconnect();
/// delete pointer
reply->deleteLater();
/// data to json
QJsonDocument jsonDocument = QJsonDocument::fromJson(byte.data());
/// process data
/// can emit in class::QObject
qDebug() << jsonDocument;
});
}
/**
* @brief request_get
* @param url
* 查询,get请求
* 注意,下方的QNetworkAccessManager 是静态对象
*/
void request_get(const QUrl &url) {
static QNetworkAccessManager manager;
QNetworkRequest request(url);
QNetworkReply *reply = manager.get(request);
receive_getReply(reply);
// QEventLoop loop;
/// [1]
// QObject::connect(&manager, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
/// [2]
// QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
// loop.exec();
}
/**
* @brief test_network
* 测试fun
*/
void test_network() {
/// 天气预报查询api
/// 首尾不要用空格
QString url = R"(http://api.k780.com:88/?app=weather.future
&appkey=10003
&sign=b59bc3ef6191eb9f747dd4e83c99f2a4
&format=json
&weaid=苏州)";
request_get(QUrl(url));
}
} // namespace
/**
* @brief main
* @param argc
* @param argv
* @return
*/
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
test_network();
return app.exec();
}
效果
这里不做排版了,不然篇幅过大
循环loop的使用
-
[1]
QNetworkAccessManager 对于每个 reply 的 finish 都会发送 finished 的信号。
如果一个 manager 处理多个请求可能会出现先后结束的问题。
-
[2]
针对每个 reply 自身的声明周期进行connect
注意,不要让这个 reply 解出 connect 就是调用
reply->disconnect();
否则可能会有部分的connect失效。或者保证运行的最后一个去取消。
void request_get(const QUrl &url) {
/// 注意是static
static QNetworkAccessManager manager;
QNetworkRequest request(url);
QNetworkReply *reply = manager.get(request);
receive_getReply(reply);
/// 设置死循环,直到请求结束
QEventLoop loop;
/// [1]
QObject::connect(&manager, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
/// [2]
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
}
讲解
配置
.pro
QT += network
header
#include <QNetworkAccessManager>
#include <QNetworkReply>
相关对象
QNetworkAccessManager
- 这是网络操作的管理者
- 若本对象消亡了,则他管理的所有网络操作均会失效
QNetworkRequest
- 网络请求的对象,用于接收url
- 当获得 reply 后,当前对象可以销毁,因为这只是 manager 的一个参数
QNetworkReply
- 进行get或者post请求后的实体
- 这个实体会异步的进行数据的接收
- 注意这个实体需要手动销毁
Https
若请求https协议,则可能会出现以下问题。
这不是Qt本身的问题,因为没有对应的ssl环境,当配置好后则可以正常运行。
此处不演示,请咨询查找。
qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed