[后端开发]GET/POST_带参/不带参

#include <QCoreApplication>

#include <QNetworkAccessManager>

#include <QNetworkRequest>

#include <QNetworkReply>

#include <QUrl>

#include <QJsonDocument>

#include <QJsonObject>

#include <QDebug>

#include <QTimer>

// 通用网络请求函数:支持 GET/POST,传入URL和请求数据(POST用)

void sendHttpRequest(QNetworkAccessManager &manager, const QUrl &url,

const QString &method = "GET", const QJsonObject &postData = QJsonObject())

{

QNetworkRequest request(url);

// 1. 设置通用请求头(JSON格式必加)

request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

// 2. 解决跨平台/跨域可能的问题:添加通用头

request.setRawHeader("Accept", "application/json");

// 3. 禁用缓存(GET/POST都适用,避免旧响应干扰)

request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork);

QNetworkReply *reply = nullptr;

if (method.compare("POST", Qt::CaseInsensitive) == 0) {

// POST请求:将JSON对象转为字节数组

QByteArray jsonBytes = QJsonDocument(postData).toJson(QJsonDocument::Compact);

reply = manager.post(request, jsonBytes);

} else {

// GET请求:无数据体

reply = manager.get(request);

}

// 4. 处理响应(Lambda表达式捕获外部变量)

QObject::connect(reply, &QNetworkReply::finished, \&() {

if (reply->error() == QNetworkReply::NoError) {

QByteArray data = reply->readAll();

QJsonParseError parseError;

QJsonDocument doc = QJsonDocument::fromJson(data, &parseError);

if (parseError.error == QJsonParseError::NoError) {

if (doc.isObject()) {

qDebug() << method << "响应JSON对象:" << doc.object();

} else if (doc.isArray()) {

qDebug() << method << "响应JSON数组:" << doc.array();

}

} else {

qDebug() << method << "响应不是JSON格式,原始数据:" << data;

}

} else {

// 打印详细错误信息(排查POST失败关键)

qDebug() << method << "请求失败:" << reply->errorString();

qDebug() << "错误码:" << reply->error();

qDebug() << "响应状态码:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

}

reply->deleteLater();

});

}

int main(int argc, char *argv\[\]) {

QCoreApplication a(argc, argv);

// 配置目标地址(替换为你的实际IP+端口+接口)

QUrl url("http://目标IP:目标端口/接口路径");

QNetworkAccessManager manager;

// ========== 1. 发送 GET 请求 ==========

sendHttpRequest(manager, url, "GET");

// ========== 2. 发送 POST 请求 ==========

// 构造POST的JSON数据(根据后端接口要求修改字段)

QJsonObject postData;

postData.insert("username", "test");

postData.insert("password", "123456");

// 延迟发送POST(可选,避免两个请求同时发送导致的竞争)

QTimer::singleShot(1000, \&() {

sendHttpRequest(manager, url, "POST", postData);

});

// ========== 3. 超时保护(可选,防止程序卡死) ==========

QTimer::singleShot(5000, &a, &QCoreApplication::quit); // 5秒后自动退出

return a.exec();

}

如果这篇文章对你有帮助,别忘了点个关注,我会持续分享更多开发避坑与实战干货,下次更新你就能第一时间看到啦~

相关推荐
程序员爱钓鱼7 分钟前
Rust if let 与 while let 详解:简化模式匹配
前端·后端·rust
爸爸61920 分钟前
UIAbility 生命周期在日记 App 中的实践
后端·华为·harmonyos·鸿蒙系统
胡萝卜术20 分钟前
从暴力到滑动窗口的终极形态:力扣3「无重复字符的最长子串」的优化进化之路
前端·javascript·面试
代码的小搬运工3 小时前
网络请求(NSURL、NSURLRequest、NSURLSessionDataTask、协议回调与 JSON 数据的基本流向)
网络·数据库·json
钛态9 小时前
前端安全防线:CSRF 攻击链路与双重 Token 校验的工程实现
前端·vue·react·web
大阳光男孩9 小时前
Spring Boot 整合 Debezium 实现 MySQL 增量数据监听(嵌入式版)
spring boot·后端·mysql
皮皮林55110 小时前
ThreadLocal 不香了?ScopedValue才是王道?
后端
张拭心10 小时前
技术管理笔记:让我“燃尽”的一天
前端
X-⃢_⃢-X10 小时前
一、第一阶段:认识 Spring Boot
java·spring boot·后端
前端工作日常10 小时前
我学习到的Java程序的生命周期
java·后端