前言
http的操作是網(wǎng)絡通信中非常常見的操作,其中廣泛使用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 是靜態(tài)對象
*/
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();
}
效果
這里不做排版了,不然篇幅過大
循環(huán)loop的使用
-
[1]
QNetworkAccessManager 對于每個 reply 的 finish 都會發(fā)送 finished 的信號。
如果一個 manager 處理多個請求可能會出現(xiàn)先后結束的問題。
-
[2]
針對每個 reply 自身的聲明周期進行connect
注意,不要讓這個 reply 解出 connect 就是調(diào)用
reply->disconnect();
否則可能會有部分的connect失效。或者保證運行的最后一個去取消。
void request_get(const QUrl &url) {
/// 注意是static
static QNetworkAccessManager manager;
QNetworkRequest request(url);
QNetworkReply *reply = manager.get(request);
receive_getReply(reply);
/// 設置死循環(huán),直到請求結束
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
- 這是網(wǎng)絡操作的管理者
- 若本對象消亡了,則他管理的所有網(wǎng)絡操作均會失效
-
QNetworkRequest
- 網(wǎng)絡請求的對象,用于接收url
- 當獲得 reply 后,當前對象可以銷毀,因為這只是 manager 的一個參數(shù)
-
QNetworkReply
- 進行get或者post請求后的實體
- 這個實體會異步的進行數(shù)據(jù)的接收
- 注意這個實體需要手動銷毀
Https
若請求https協(xié)議,則可能會出現(xiàn)以下問題。
這不是Qt本身的問題,因為沒有對應的ssl環(huán)境,當配置好后則可以正常運行。文章來源:http://www.zghlxwxcb.cn/news/detail-524788.html
此處不演示,請咨詢查找。文章來源地址http://www.zghlxwxcb.cn/news/detail-524788.html
qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
END
到了這里,關于(Qt) Http之Get請求使用基礎的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!