使用Qt封裝一個(gè)發(fā)送http請(qǐng)求通用類
需求
Qt 代碼中使用QNetworkRequest、QNetworkReply進(jìn)行http請(qǐng)求,能不能整理成一個(gè)通用的方法或者類。
實(shí)現(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中使用了一個(gè)QEventLoop,為了使發(fā)送的事件得到及時(shí)的處理,不加這個(gè)的話,測(cè)試發(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請(qǐng)求
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請(qǐng)求
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封裝一個(gè)發(fā)送http請(qǐng)求通用類的文章就介紹到這了,更多相關(guān)Qt發(fā)送http請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ Boost Container庫(kù)示例詳細(xì)講解
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱2022-11-11
C語(yǔ)言實(shí)現(xiàn)手機(jī)電話簿管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)手機(jī)電話簿管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
基于C++實(shí)現(xiàn)kinect+opencv 獲取深度及彩色數(shù)據(jù)
本文的主要思想是Kinect SDK 讀取彩色、深度、骨骼信息并用OpenCV顯示,非常的實(shí)用,有需要的小伙伴可以參考下2015-12-12
VS2017開(kāi)發(fā)C語(yǔ)言出現(xiàn)“no_init_all“的解決辦法
這篇文章介紹了VS2017開(kāi)發(fā)C語(yǔ)言出現(xiàn)“no_init_all“的解決辦法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
c++如何使用openssl接口來(lái)生成隨機(jī)數(shù)
OpenSSL是一個(gè)強(qiáng)大的加密庫(kù),不僅支持加密解密,還能生成隨機(jī)數(shù),設(shè)置過(guò)程包括下載資源文件、配置項(xiàng)目及修改屬性頁(yè)等步驟,確保庫(kù)文件正確包含,在Visual Studio中正確配置后,可使用RAND_bytes函數(shù)生成隨機(jī)數(shù),此過(guò)程需要注意文件路徑和附加目錄的設(shè)置2024-10-10
C/C++ Socket設(shè)置接收超時(shí)時(shí)間的多種方法
網(wǎng)絡(luò)編程中經(jīng)常需要處理的一個(gè)問(wèn)題就是如何正確地處理Socket超時(shí),對(duì)于C/C++,有幾種常用的技術(shù)可以用來(lái)設(shè)置Socket接收超時(shí)時(shí)間,在這篇文章中,我們將詳細(xì)介紹如何在C/C++中設(shè)置Socket的非阻塞模式以及如何配置接收超時(shí)時(shí)間,需要的朋友可以參考下2024-01-01

