使用Qt封裝一個發(fā)送http請求通用類
需求
Qt 代碼中使用QNetworkRequest、QNetworkReply進(jìn)行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)半天都不能調(diào)到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(); }
到此這篇關(guān)于使用Qt封裝一個發(fā)送http請求通用類的文章就介紹到這了,更多相關(guān)Qt發(fā)送http請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ Boost Container庫示例詳細(xì)講解
Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱2022-11-11基于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“的解決辦法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12C/C++ Socket設(shè)置接收超時時間的多種方法
網(wǎng)絡(luò)編程中經(jīng)常需要處理的一個問題就是如何正確地處理Socket超時,對于C/C++,有幾種常用的技術(shù)可以用來設(shè)置Socket接收超時時間,在這篇文章中,我們將詳細(xì)介紹如何在C/C++中設(shè)置Socket的非阻塞模式以及如何配置接收超時時間,需要的朋友可以參考下2024-01-01