QT中的网络请求

打印 上一主题 下一主题

主题 1818|帖子 1818|积分 5454

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、主程序(main.cpp)

  1. #include <QCoreApplication>
  2. #include <QNetworkAccessManager>
  3. #include <QNetworkReply>
  4. #include <QNetworkRequest>
  5. #include <QUrlQuery>
  6. #include <QJsonDocument>
  7. #include <QJsonObject>
  8. #include <QDebug>
  9. // 全局网络管理器(需在事件循环中使用)
  10. QNetworkAccessManager* manager = nullptr;
  11. // 处理 POST 请求的响应
  12. void handleReply(QNetworkReply* reply) {
  13.     // 检查是否有错误
  14.     if (reply->error() != QNetworkReply::NoError) {
  15.         qDebug() << "请求失败,错误信息:" << reply->errorString();
  16.         reply->deleteLater(); // 释放资源
  17.         return;
  18.     }
  19.     // 读取响应数据(二进制格式)
  20.     QByteArray responseData = reply->readAll();
  21.     qDebug() << "响应内容:" << responseData;
  22.     // 可选:解析 JSON 响应(假设服务端返回 JSON)
  23.     QJsonParseError parseError;
  24.     QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData, &parseError);
  25.     if (parseError.error == QJsonParseError::NoError) {
  26.         QJsonObject jsonObj = jsonDoc.object();
  27.         qDebug() << "解析后的 JSON 数据:" << jsonObj.toVariantMap();
  28.     }
  29.     // 释放资源(异步释放,避免直接 delete)
  30.     reply->deleteLater();
  31.     // 退出事件循环(控制台程序示例结束)
  32.     QCoreApplication::quit();
  33. }
  34. // 发送 POST 请求(表单数据)
  35. void postFormData() {
  36.     QNetworkRequest request;
  37.     // 设置目标 URL(示例用 httpbin.org 的测试接口)
  38.     request.setUrl(QUrl("https://httpbin.org/post"));
  39.     // 设置 Content-Type(表单数据格式)
  40.     request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
  41.     // 构造表单数据(键值对)
  42.     QUrlQuery postData;
  43.     postData.addQueryItem("username", "doubao");
  44.     postData.addQueryItem("password", "123456");
  45.     postData.addQueryItem("role", "tester");
  46.     // 发送 POST 请求
  47.     QNetworkReply* reply = manager->post(request, postData.toString(QUrl::FullyEncoded).toUtf8());
  48.     // 关联响应处理槽函数
  49.     QObject::connect(reply, &QNetworkReply::finished, [=]() { handleReply(reply); });
  50. }
  51. // 发送 POST 请求(JSON 数据)
  52. void postJsonData() {
  53.     QNetworkRequest request;
  54.     request.setUrl(QUrl("https://httpbin.org/post"));
  55.     // 设置 Content-Type(JSON 格式)
  56.     request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
  57.     // 构造 JSON 数据
  58.     QJsonObject jsonData;
  59.     jsonData["username"] = "doubao";
  60.     jsonData["password"] = "123456";
  61.     jsonData["is_vip"] = true;
  62.     QJsonDocument jsonDoc(jsonData);
  63.     QByteArray jsonBody = jsonDoc.toJson();
  64.     // 发送 POST 请求
  65.     QNetworkReply* reply = manager->post(request, jsonBody);
  66.     QObject::connect(reply, &QNetworkReply::finished, [=]() { handleReply(reply); });
  67. }
  68. int main(int argc, char *argv[]) {
  69.     QCoreApplication a(argc, argv);
  70.     // 初始化网络管理器
  71.     manager = new QNetworkAccessManager(&a);
  72.     // 选择发送方式(示例发送表单数据,可改为 postJsonData() 测试 JSON)
  73.     postFormData();
  74.     // 启动事件循环(必须,否则无法接收网络响应)
  75.     return a.exec();
  76. }
复制代码
二、核心组件


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


  • 设置请求头

    • 表单数据需设置 Content-Type: application/x-www-form-urlencoded。
    • JSON 数据需设置 Content-Type: application/json。

  • 构造请求体

    • 表单数据用 QUrlQuery 生成键值对(主动编码)。
    • JSON 数据用 QJsonObject + QJsonDocument 生成尺度 JSON 字符串。

  • 异步处理响应

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

四、测试验证


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



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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表