使用Qt封裝一個發(fā)送http請求通用類
更新時間:2024年12月02日 11:36:32 作者:Lydro
這篇文章主要為大家詳細介紹了如何使用Qt封裝一個通用類,可以通過QNetworkRequest和QNetworkReply進行http請求,感興趣的可以了解一下
需求
Qt 代碼中使用QNetworkRequest、QNetworkReply進行http請求,能不能整理成一個通用的方法或者類。
實現(xiàn)
HttpClient類
#include <QObject> #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QUrl> #include <QUrlQuery> #include <QByteArray> #include <QJsonObject> #include <QJsonDocument> #include <QDebug> #include <QEventLoop> class HttpClient : public QObject { Q_OBJECT public: explicit HttpClient(QObject *parent = nullptr) : QObject(parent), networkManager(new QNetworkAccessManager(this)) { connect(networkManager, &QNetworkAccessManager::finished, this, &HttpClient::onReplyFinished); } void get(const QUrl &url, const QUrlQuery &query = QUrlQuery()) { QUrl fullUrl = url; fullUrl.setQuery(query); QNetworkRequest request(fullUrl); networkManager->get(request); eventLoot->exec(); } void post(const QUrl &url, const QByteArray &data) { QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); networkManager->post(request, data); eventLoot->exec(); } signals: void requestFinished(const QByteArray &responseData, QNetworkReply::NetworkError error); private slots: void onReplyFinished(QNetworkReply *reply) { if (reply->error() == QNetworkReply::NoError) { QByteArray responseData = reply->readAll(); emit requestFinished(responseData, QNetworkReply::NoError); } else { emit requestFinished(QByteArray(), reply->error()); } reply->deleteLater(); } private: QNetworkAccessManager *networkManager; QEventLoop eventLoop; };
HttpClient中使用了一個QEventLoop,為了使發(fā)送的事件得到及時的處理,不加這個的話,測試發(fā)現(xiàn)半天都不能調到onReplyFinished槽函數(shù)中。
使用
#include <QCoreApplication> #include <QUrl> #include <QUrlQuery> #include <QJsonDocument> #include <QJsonObject> #include <QByteArray> #include "HttpClient.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); HttpClient client; // 發(fā)送GET請求 QUrl getUrl("https://jsonplaceholder.typicode.com/posts/1"); QObject::connect(&client, &HttpClient::requestFinished, [](const QByteArray &responseData, QNetworkReply::NetworkError error) { if (error == QNetworkReply::NoError) { QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData); QJsonObject jsonObj = jsonDoc.object(); qDebug() << "GET Response:" << jsonObj; } else { qDebug() << "GET Error:" << error; } }); client.get(getUrl); // 發(fā)送POST請求 QUrl postUrl("https://jsonplaceholder.typicode.com/posts"); QJsonObject postData; postData["title"] = "foo"; postData["body"] = "bar"; postData["userId"] = 1; QByteArray postDataBytes = QJsonDocument(postData).toJson(); QObject::connect(&client, &HttpClient::requestFinished, [](const QByteArray &responseData, QNetworkReply::NetworkError error) { if (error == QNetworkReply::NoError) { QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData); QJsonObject jsonObj = jsonDoc.object(); qDebug() << "POST Response:" << jsonObj; } else { qDebug() << "POST Error:" << error; } }); client.post(postUrl, postDataBytes); return a.exec(); }
到此這篇關于使用Qt封裝一個發(fā)送http請求通用類的文章就介紹到這了,更多相關Qt發(fā)送http請求內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于C++實現(xiàn)kinect+opencv 獲取深度及彩色數(shù)據(jù)
本文的主要思想是Kinect SDK 讀取彩色、深度、骨骼信息并用OpenCV顯示,非常的實用,有需要的小伙伴可以參考下2015-12-12VS2017開發(fā)C語言出現(xiàn)“no_init_all“的解決辦法
這篇文章介紹了VS2017開發(fā)C語言出現(xiàn)“no_init_all“的解決辦法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12