使用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)文章
大家注意vector, list, set, map成員函數(shù)erase
set和map是由紅黑樹(shù)來(lái)實(shí)現(xiàn)的,當(dāng)erase的時(shí)候迭代器就失效了,也就是說(shuō)我們要在迭代器失效之前保留一個(gè)副本,根據(jù)這個(gè)副本我們才能繼續(xù)遍歷下一個(gè)元素2013-09-09
C++右值引用與move和forward函數(shù)的使用詳解
為了支持移動(dòng)操作,新標(biāo)準(zhǔn)引入了一種新的引用類型——右值引用(rvalue reference)。所謂右值引用就是必須綁定到右值的引用,這篇文章主要介紹了C++右值引用與move和forward的使用2022-08-08
詳解C語(yǔ)言中return返回函數(shù)局部變量的問(wèn)題

