马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一、主程序(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();
- }
复制代码 二、核心组件
- 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() 读取响应内容。
四、测试验证
- 编译运行程序,控制台会输出以下内容(以表单数据为例):
- 响应内容: "{"args":{},"data":"","files":{},"form":{"password":"123456","role":"tester","username":"doubao"},...}"
- 解析后的 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企服之家,中国第一个企服评测及商务社交产业平台。 |