当前位置: 首页 > news >正文

QT中的网络请求

一、主程序(main.cpp)

#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QUrlQuery>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>// 全局网络管理器(需在事件循环中使用)
QNetworkAccessManager* manager = nullptr;// 处理 POST 请求的响应
void handleReply(QNetworkReply* reply) {// 检查是否有错误if (reply->error() != QNetworkReply::NoError) {qDebug() << "请求失败,错误信息:" << reply->errorString();reply->deleteLater(); // 释放资源return;}// 读取响应数据(二进制格式)QByteArray responseData = reply->readAll();qDebug() << "响应内容:" << responseData;// 可选:解析 JSON 响应(假设服务端返回 JSON)QJsonParseError parseError;QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData, &parseError);if (parseError.error == QJsonParseError::NoError) {QJsonObject jsonObj = jsonDoc.object();qDebug() << "解析后的 JSON 数据:" << jsonObj.toVariantMap();}// 释放资源(异步释放,避免直接 delete)reply->deleteLater();// 退出事件循环(控制台程序示例结束)QCoreApplication::quit();
}// 发送 POST 请求(表单数据)
void postFormData() {QNetworkRequest request;// 设置目标 URL(示例用 httpbin.org 的测试接口)request.setUrl(QUrl("https://httpbin.org/post"));// 设置 Content-Type(表单数据格式)request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");// 构造表单数据(键值对)QUrlQuery postData;postData.addQueryItem("username", "doubao");postData.addQueryItem("password", "123456");postData.addQueryItem("role", "tester");// 发送 POST 请求QNetworkReply* reply = manager->post(request, postData.toString(QUrl::FullyEncoded).toUtf8());// 关联响应处理槽函数QObject::connect(reply, &QNetworkReply::finished, [=]() { handleReply(reply); });
}// 发送 POST 请求(JSON 数据)
void postJsonData() {QNetworkRequest request;request.setUrl(QUrl("https://httpbin.org/post"));// 设置 Content-Type(JSON 格式)request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");// 构造 JSON 数据QJsonObject jsonData;jsonData["username"] = "doubao";jsonData["password"] = "123456";jsonData["is_vip"] = true;QJsonDocument jsonDoc(jsonData);QByteArray jsonBody = jsonDoc.toJson();// 发送 POST 请求QNetworkReply* reply = manager->post(request, jsonBody);QObject::connect(reply, &QNetworkReply::finished, [=]() { handleReply(reply); });
}int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 初始化网络管理器manager = new QNetworkAccessManager(&a);// 选择发送方式(示例发送表单数据,可改为 postJsonData() 测试 JSON)postFormData();// 启动事件循环(必须,否则无法接收网络响应)return a.exec();
}

二、核心组件

  1. QNetworkAccessManager:Qt 网络模块的核心类,负责管理网络请求(发送 GET/POST 等)。
  2. QNetworkRequest:封装请求信息(URL、请求头、超时设置等)。
  3. QNetworkReply:表示一个网络请求的响应,用于读取数据或处理错误。

三、关键步骤

  1. 设置请求头

    • 表单数据需设置 Content-Type: application/x-www-form-urlencoded
    • JSON 数据需设置 Content-Type: application/json
  2. 构造请求体

    • 表单数据用 QUrlQuery 生成键值对(自动编码)。
    • JSON 数据用 QJsonObject + QJsonDocument 生成标准 JSON 字符串。
  3. 异步处理响应

    • 通过 QNetworkReply::finished 信号监听请求完成事件。
    • 使用 reply->error() 检查错误,reply->readAll() 读取响应内容。

四、测试验证

  1. 编译运行程序,控制台会输出以下内容(以表单数据为例):
    响应内容: "{\"args\":{},\"data\":\"\",\"files\":{},\"form\":{\"password\":\"123456\",\"role\":\"tester\",\"username\":\"doubao\"},...}" 
    解析后的 JSON 数据: QMap(("args", QVariant(QMap,())), ("data", QVariant(QString, "")), ...)
    
  2. 若需测试 JSON 数据,将 main 函数中的 postFormData() 改为 postJsonData() 即可。

五、注意事项

  • HTTPS 支持:若目标 URL 为 HTTPS(如示例中的 https://httpbin.org/post),需确保 Qt 编译时启用了 OpenSSL 支持(Windows 需将 libeay32.dllssleay32.dll 放入程序目录)。
  • 编码问题:表单数据用 QUrlQuery::toString(QUrl::FullyEncoded) 自动编码,避免中文乱码。
  • 资源释放:使用 reply->deleteLater() 异步释放响应对象,避免内存泄漏。

相关文章:

  • 【软件设计师:软件工程】11.项目管理
  • V4L2应用程序开发-- 控制流程
  • 枚举 · 例13-【模板】双指针
  • 如何使用极狐GitLab 软件包仓库功能托管 terraform?
  • V 型球阀:多材质多驱动,精准适配复杂严苛工况-耀圣
  • 【UltralyticsYolo11图像分类完整项目-03】Onnx版Cpu预测C++实现
  • 解决word里插入公式后打不开的问题
  • Ubuntu 安装远程桌面连接RDP方式
  • Docker部署常见应用之Superset
  • 监控系统进阶方案:OpenObserve的Docker部署与远程访问配置指南
  • 【Git】【commit】查看未推送的提交查看指定commit的修改内容合并不连续的commit
  • 总线通信篇:I2C、SPI、CAN 的底层结构与多机通信设计
  • python3连接数据库工具类之Oracle
  • C++入门小馆 :多态
  • 第二章 Logback的架构(三)
  • Web 自动化之 HTML JavaScript 详解
  • HTML10:iframe内联框架
  • HTML9:页面结构分析
  • 利用session在html和MySQL实现登录
  • 桥隧坡灾害监测报警:用科技筑起生命安全的“智能防线”
  • 习近平出席俄罗斯纪念苏联伟大卫国战争胜利80周年庆典
  • 印巴战火LIVE丨印巴互相发动无人机袭击,巴官员称两国已在国安层面接触
  • 追光|铁皮房、土操场,这有一座“筑梦”摔跤馆
  • 第1现场 | 50多年来首次!印度举行大规模民防演习
  • 商务部再回应中美经贸高层会谈
  • 中国以“大幅开放市场”回应贸易保护主义