#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include <QJsonDocument>
#include <QJsonObject>
#include <QUrlQuery>
#include <QDebug>
class HttpClient : public QObject {
Q_OBJECT
public:
HttpClient(QObject *parent = nullptr) : QObject(parent) {
manager = new QNetworkAccessManager(this);
}
// 发送GET请求
void get(const QString &url) {
QNetworkRequest request;
request.setUrl(QUrl(url));
QNetworkReply *reply = manager->get(request);
connect(reply, &QNetworkReply::finished, [=]() { handleResponse(reply); });
}
// 发送POST请求(JSON格式)
void postJson(const QString &url, const QJsonObject &data) {
QNetworkRequest request;
request.setUrl(QUrl(url));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QByteArray jsonData = QJsonDocument(data).toJson();
QNetworkReply *reply = manager->post(request, jsonData);
connect(reply, &QNetworkReply::finished, [=]() { handleResponse(reply); });
}
// 发送POST请求(表单格式)
void postForm(const QString &url, const QUrlQuery &query) {
QNetworkRequest request;
request.setUrl(QUrl(url));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
QByteArray formData = query.toString(QUrl::FullyEncoded).toUtf8();
QNetworkReply *reply = manager->post(request, formData);
connect(reply, &QNetworkReply::finished, [=]() { handleResponse(reply); });
}
private slots:
void handleResponse(QNetworkReply *reply) {
if (reply->error() == QNetworkReply::NoError) {
QByteArray response = reply->readAll();
qDebug() << "Response:" << response;
// 解析JSON数据
parseJson(response);
} else {
qDebug() << "Error:" << reply->errorString();
}
reply->deleteLater(); // 释放内存
}
void parseJson(const QByteArray &json_data) {
QJsonDocument json_doc = QJsonDocument::fromJson(json_data);
if (json_doc.isNull()) {
qDebug() << "Invalid JSON data";
return;
}
if (json_doc.isObject()) {
QJsonObject obj = json_doc.object();
// 处理JSON对象
parseJsonObject(obj);
} else if (json_doc.isArray()) {
QJsonArray array = json_doc.array();
// 处理JSON数组
parseJsonArray(array);
} else {
qDebug() << "JSON data is neither an object nor an array";
}
}
void parseJsonObject(const QJsonObject &obj) {
// 遍历JSON对象的键值对
for (auto it = obj.begin(); it != obj.end(); ++it) {
QString key = it.key();
QJsonValue value = it.value();
qDebug() << "Key:" << key << "Value:";
// 根据值的类型进行处理
if (value.isString()) {
qDebug() << value.toString();
} else if (value.isDouble()) {
qDebug() << value.toDouble();
} else if (value.isBool()) {
qDebug() << value.toBool();
} else if (value.isArray()) {
parseJsonArray(value.toArray());
} else if (value.isObject()) {
parseJsonObject(value.toObject());
} else {
qDebug() << "Unknown value type";
}
}
}
void parseJsonArray(const QJsonArray &array) {
// 遍历JSON数组的元素
for (int i = 0; i < array.size(); ++i) {
QJsonValue value = array.at(i);
if (value.isObject()) {
parseJsonObject(value.toObject());
} else if (value.isArray()) {
parseJsonArray(value.toArray());
} else {
// 处理基本类型值
if (value.isString()) {
qDebug() << value.toString();
} else if (value.isDouble()) {
qDebug() << value.toDouble();
} else if (value.isBool()) {
qDebug() << value.toBool();
} else {
qDebug() << "Unknown value type in array";
}
}
}
}
private:
QNetworkAccessManager *manager;
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
HttpClient client;
// 示例:发送GET请求
client.get("https://api.example.com/data");
// 示例:发送POST请求(JSON数据)
QJsonObject json;
json["key"] = "value";
client.postJson("https://api.example.com/submit", json);
// 示例:发送POST请求(表单数据)
QUrlQuery query;
query.addQueryItem("username", "john");
query.addQueryItem("password", "12345");
client.postForm("https://api.example.com/login", query);
return a.exec();
}
qt搭建http客户端demo
最新推荐文章于 2025-03-14 23:32:43 发布