如果不使用 QNetworkCookieJar
来保存 cookies,你可以手动处理 HTTP 响应中的 Set-Cookie
头,并在后续的请求中将这些 cookies 添加到请求中。以下是一个简单的示例,展示了如何做到这一点:
示例代码
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QStringList>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QNetworkAccessManager manager;
// 发送第一个请求
QNetworkRequest request(QUrl("http://example.com/api/login"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
// 连接 finished 信号,以获取响应
QObject::connect(&manager, &QNetworkAccessManager::finished, [&](QNetworkReply *reply) {
if (reply->error() == QNetworkReply::NoError) {
// 获取 Set-Cookie 头部
QList<QByteArray> cookieHeaders = reply->rawHeaderList();
QString cookies;
for (const QByteArray &header : cookieHeaders) {
if (header.toLower() == "set-cookie") {
// 将所有 Cookies 拼接起来
cookies += reply->rawHeader(header) + "; ";
}
}
qDebug() << "Received Cookies:" << cookies;
// 下一次请求时使用这些 cookies
QNetworkRequest nextRequest(QUrl("http://example.com/api/next"));
nextRequest.setRawHeader("Cookie", cookies.toUtf8());
// 发送下一个请求
manager.get(nextRequest);
} else {
qDebug() << "Error:" << reply->errorString();
}
reply->deleteLater();
});
// 实际发送登录请求(如有需要,可以在此设置 POST 数据)
manager.post(request, "username=user&password=pass");
return a.exec();
}
关键步骤解析:
发送请求:我们首先通过
manager.post()
方法向服务器发送 POST 请求。处理响应:
- 使用
QObject::connect
将finished
信号连接到 lambda 函数,这样当收到响应时就会调用该函数。 - 检查是否存在错误,如果没有,则读取响应中的
Set-Cookie
头。
- 使用
提取和拼接 Cookies:
- 遍历所有原始响应头,找到所有的
Set-Cookie
并将它们合并为一个字符串。注意,有些服务器可能会返回多个 cookie。
- 遍历所有原始响应头,找到所有的
使用 Cookies 发起新的请求:
- 在发起后续请求之前,通过
setRawHeader
方法手动设置 Cookie。
- 在发起后续请求之前,通过
这种方法允许你完全控制 Cookie 的管理,而无需依赖 Qt 内置的 Cookie Jar。不过,需要确保你在应用程序中妥善管理和存储这些 Cookies,以便在适当的时候进行重用。
内容由零声教学AI助手提供,问题来源于学员提问