使用Qt封裝一個發(fā)送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)半天都不能調(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)文章
Vscode配置C/C++環(huán)境使用minGW(保姆級配置過程)
本文主要介紹了Vscode配置C/C++環(huán)境使用minGW(保姆級配置過程),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
Visual?Studio?Code?配置C、C++?文件debug調(diào)試環(huán)境的詳細過程
這篇文章主要介紹了Visual?Studio?Code?配置C、C++?文件debug調(diào)試環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
C語言數(shù)據(jù)結(jié)構(gòu)之鏈隊列的基本操作
這篇文章主要為大家介紹了C語言之鏈隊列的基本操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12

