qt程序连接服务器get,post请求数据(http)
·
1、首先创建一个qt程序,在.pro文件中加入网络协议,即最底层加入一行
QT += network
2、接着就是在工程文件的.h文件中添加要进行的操作
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTimer>
#include <QLabel>
加上这几个声明之后接着在private slots处添加
private slots:
void handleNetworkReply(QNetworkReply *reply); // 处理网络响应
void handlePostReply(QNetworkReply *reply);
这两个函数一个是处理get请求用的一个是处理post请求用的。
然后再在private处添加
private:
QNetworkAccessManager *networkManager; // 网络管理器
QTimer *refreshTimer; // 定时器成员变量
void fetchTowerInfo(); // 数据获取函数
void postTowerInfo(); // 数据发送函数
这个定时器变量我是用来自动获取已经发送数据用的,也可以通过点击发送数据,即对按钮转到槽,点击操作之后用来函数操作即可。
这样在.h文件中就搭建好基础的请求了,然后来到与.h文件对应的.cpp文件中。
#include <QNetworkRequest>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
#include <QUrlQuery>
#include <QMessageBox>
需要用到的一些声明,接着
Main****::Main****(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Main****)
{
ui->setupUi(this);
// 初始化网络管理器
networkManager = new QNetworkAccessManager(this);
refreshTimer = new QTimer(this); // 现在QTimer类型已完整
// 设置定时刷新(示例:每60秒)
connect(refreshTimer, &QTimer::timeout, this, &MainWindow_3::fetchTowerInfo);
connect(refreshTimer, &QTimer::timeout, this, &MainWindow_3::postTowerInfo);
refreshTimer->start(600000);
// 立即执行首次获取
fetchTowerInfo();
postTowerInfo();
}
get请求数据
//get服务器数据请求
void Main****::fetchTowerInfo()
{
QUrl url("http://*******/*****");//要访问的url地址
QUrlQuery query;
query.addQueryItem("**", "****");//访问的关键字
url.setQuery(query);
QNetworkRequest request(url);
QNetworkReply *reply = networkManager->get(request);
connect(reply, &QNetworkReply::finished, [this, reply]() {
handleNetworkReply(reply);
});
}
void MainWindow_3::handleNetworkReply(QNetworkReply *reply) {
if (reply->error() == QNetworkReply::NoError) {
ui->tbtn_data_status->setIcon(QIcon(":/pic/HTTP.png"));//这个是对于get数据的ui验证,可以不用
QByteArray data = reply->readAll();
QJsonParseError parseError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &parseError);
// 调试:打印原始JSON数据
qDebug() << "原始JSON数据:" << data;
if (parseError.error == QJsonParseError::NoError && !jsonDoc.isNull()) {
if (jsonDoc.isObject()) {
QJsonObject jsonObj = jsonDoc.object();
// 检查是否存在"data"字段
if (jsonObj.contains("data") && jsonObj["data"].isObject()) {
QJsonObject dataObj = jsonObj["data"].toObject();
// 通用函数:安全提取任意JSON值并转为字符串
auto safeGetValue = [](const QJsonObject &obj, const QString &key) -> QString {
if (!obj.contains(key)) return QString("[字段不存在]");
QJsonValue value = obj.value(key);
if (value.isString()) {
return value.toString();
} else if (value.isDouble()) {
return QString::number(value.toInt()); // 或 toDouble()保留小数
} else if (value.isBool()) {
return value.toBool() ? "true" : "false";
} else if (value.isObject() || value.isArray()) {
return QString(QJsonDocument(value.toObject()).toJson());
} else {
return "[未知类型]";
}
};
// 更新UI控件(支持所有数据类型)
ui->lb_anti->setText(QString::fromUtf8(data)); // 示例字段,该字段为显示所有返回的服务器报文
//下列的字段为显示服务器返回的数据中指定的数据的内容
// ui->lb_1_id->setText(safeGetValue(dataObj, "ename"));
// ui->lb_2->setText(safeGetValue(dataObj, "id"));
// ui->lb_t2e->setText(safeGetValue(dataObj, "1"));
// ui->lb_d3->setText(safeGetValue(dataObj, "2e"));
// ui->lb_4->setText(safeGetValue(dataObj, "m3l")); // 假设字段名为date
} else {
ui->lb_anti->setText("错误:JSON中缺少data对象");
}
} else {
ui->lb_anti->setText("错误:JSON不是对象");
}
} else {
ui->lb_anti->setText("JSON解析错误: " + parseError.errorString());
}
} else {
ui->tbtn_data_status->setIcon(QIcon(":/pic/HTTP_error.png"));
ui->lb_anti->setText("网络错误: " + reply->errorString());
}
reply->deleteLater();
}
然后是post请求
//post发送数据向服务器
void Main*****::postTowerInfo()//get服务器数据请求
{
// 1. 从UI控件收集数据
QJsonObject postData;
postData["1"] = 1; // 示例固定ID
postData["2"] = ui->lb_2->text().toDouble();
postData["3"] = ui->lb_1->text().toDouble();
postData["4"] = ui->lb_r2n->text().toDouble();
postData["8"] = ui->lb_3->text().toDouble();
postData["5"] = ui->lb_5d->text().toDouble();
postData["6t"] = ui->lb_4->text().toDouble();
// 2. 转换为JSON格式
QJsonDocument doc(postData);
QByteArray jsonData = doc.toJson();
// 3. 设置请求头
QUrl url("http://******:80/****");
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
// 4. 发送POST请求
QNetworkReply *reply = networkManager->post(request, jsonData);
connect(reply, &QNetworkReply::finished, [this, reply]() {
handlePostReply(reply);
});
// 可选:禁用按钮防止重复提交
// ui->pbtn_save->setEnabled(false);
}
// 处理POST响应
void MainWindow_3::handlePostReply(QNetworkReply *reply)
{
// if (reply->error() == QNetworkReply::NoError) {
// QByteArray response = reply->readAll();
// QMessageBox::information(this, "成功", "数据更新成功!\n" );
// } else {
// QMessageBox::critical(this, "错误", "提交失败: " + reply->errorString());
// }
// reply->deleteLater();
if (reply->error() == QNetworkReply::NoError) {
QByteArray data = reply->readAll();
QJsonDocument jsonDoc = QJsonDocument::fromJson(data);
if (!jsonDoc.isNull() && jsonDoc.isObject()) {
QJsonObject jsonObj = jsonDoc.object();
// 检查服务器返回的业务状态码
int code = jsonObj["code"].toInt();
QString message = jsonObj["message"].toString();
if (code == 200) { // 假设200表示成功
QJsonObject dataObj = jsonObj["data"].toObject();
// 正常处理数据...
// ui->le_current_height->setText(QString::number(dataObj["height"].toDouble()));
QMessageBox::information(this, "成功", "数据更新成功!\n" );
} else {
// 显示服务器返回的错误信息
QMessageBox::warning(this, "操作失败",
QString("错误码: %1\n错误信息: %2").arg(code).arg(message));
// 可选:标记UI状态
// ui->lb_status->setText("状态: 异常");
// ui->lb_status->setStyleSheet("color: red;");
}
}
} else {
// 网络层错误
QMessageBox::critical(this, "网络错误", reply->errorString());
}
reply->deleteLater();
}
然后就可以了
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)