#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();
}
如果这篇文章对你有帮助,别忘了点个关注,我会持续分享更多开发避坑与实战干货,下次更新你就能第一时间看到啦~