在 Qt C++ 中实现一个 HTTP 客户端以发送 GET 请求并接收 JSON 响应可以使用 QNetworkAccessManager
。以下是一个简单的示例,演示如何请求指定的 URL 并处理返回的数据。
示例代码
确保您的 Qt 项目文件(.pro)中包含了 network
模块:
QT += core network
然后,在您的 C++ 源文件中,可以按照下面的方式实现 HTTP GET 请求:
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QObject>
class HttpClient : public QObject {
Q_OBJECT
public:
HttpClient() {
// 创建网络访问管理器
manager = new QNetworkAccessManager(this);
// 设置请求的 URL
QUrl url("http://10.29.3.110:7022/jeecg-boot/360check/tServerCameraConfig/getServerCameraConfig");
QNetworkRequest request(url);
// 发送 GET 请求
reply = manager->get(request);
// 连接信号和槽
connect(reply, &QNetworkReply::finished, this, &HttpClient::onResponseReceived);
}
private slots:
void onResponseReceived() {
if (reply->error() == QNetworkReply::NoError) {
QByteArray responseData = reply->readAll();
parseResponse(responseData);
} else {
qWarning() << "Error:" << reply->errorString();
}
reply->deleteLater(); // 清理回复对象
}
private:
void parseResponse(const QByteArray &data) {
// 将响应数据解析为 JSON 对象
QJsonDocument jsonDoc = QJsonDocument::fromJson(data);
if (jsonDoc.isNull()) {
qWarning() << "Failed to create JSON doc.";
return;
}
QJsonObject jsonObj = jsonDoc.object();
// 获取字段值,例如 success, message 等等
bool success = jsonObj["success"].toBool();
QString message = jsonObj["message"].toString();
qDebug() << "Success:" << success;
qDebug() << "Message:" << message;
if (jsonObj.contains("result")) {
QJsonArray resultArray = jsonObj["result"].toArray();
for (const auto &item : resultArray) {
QJsonObject serverInfo = item.toObject();
int id = serverInfo["id"].toInt();
QString serverName = serverInfo["serverName"].toString();
QString serverAddress = serverInfo["serverAddress"].toString();
QString camera = serverInfo["camera"].toString();
qDebug() << "ID:" << id;
qDebug() << "Server Name:" << serverName;
qDebug() << "Server Address:" << serverAddress;
qDebug() << "Camera:" << camera;
}
}
// 可以根据需要继续处理其他字段,比如 timestamp 等等。
}
private:
QNetworkAccessManager *manager;
QNetworkReply *reply;
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
HttpClient client; // 创建 HTTP 客户端实例
return a.exec(); // 启动事件循环
}
#include "main.moc"
代码说明
HttpClient 类:封装了所有与网络相关的逻辑。
构造函数:
- 创建
QNetworkAccessManager
实例。 - 设置目标 URL,并发起 GET 请求。
- 连接请求完成信号到
onResponseReceived()
槽。
- 创建
onResponseReceived 函数:
- 检查是否有错误。如果没有,则读取响应数据并调用
parseResponse()
函数解析 JSON 数据。 - 如果有错误,输出错误信息。
- 检查是否有错误。如果没有,则读取响应数据并调用
parseResponse 函数:
- 使用
QJsonDocument
来解析 JSON 数据。 - 从 JSON 对象中提取所需的信息,并通过调试信息输出。
- 使用
主函数:创建一个
HttpClient
实例并启动事件循环。
注意事项
- 确保网络可达性,并且目标服务器能够正常响应请求。
- 根据需要添加适当的异常处理,以确保程序在出错时不会崩溃。
- 如果您正在使用 Qt 的 GUI 应用程序,请考虑将类改为继承自 QWidget 或 QObject,而不是直接使用控制台应用程序。
内容由零声教学AI助手提供,问题来源于学员提问