文章目录
- 一、背景
- 二、示例代码
- 1.自己组装HTTP请求(成功)
- 2.采用项目网络组件库(失败)
- 3.解决办法(成功)
一、背景
我准备在每一次HTTP请求头中加入自己定义的cookie,以便服务端进行验证。所以我通过自己去组装HTTP请求,cookie确实设置进去了,但由于项目中使用的网络通用组件库,我不得不使用这个(为了代码的统一性),我对其已经提供的API进行设置,却始终无法注入自己设置的cookie。
二、示例代码
1.自己组装HTTP请求(成功)
QUrl url("www.4399.com");
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
request.setRawHeader("cookie", QString("apiKey=eyhbskdasdjkjasd");
QString data = "counselor_id=540&offset=100";
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
manager->post(request, data.toUtf8());
connect(manager, &QNetworkAccessManager::finished, this, &SearchHelper::onFinished);
2.采用项目网络组件库(失败)
通过组件库封装的setRawHeader,我也采用同样的设置头方法,但是依然没有成功,因为就算我注入自己定义的cookie,也会被缓存在本地的cookie所覆盖。那这个本地的cookie缓存是怎么来的呢,是因为网络组件库有一个全局的对象,所有的请求都走这一条链路,那么有可能在后续的请求时服务端会通过set-cookie返回一个cookie,从而被存储到了本地,会在后续的请求时带上,而自己组装的请求是单链路不会存在这种问题。
3.解决办法(成功)
在post请求之前,重新设置cookie对象,然后再注入自定义的cookie
QNetworkAccessManager **m_NetworkAccess = new QNetworkAccessManager(this);
QUrl url("www.google.com");
...
QList<QNetworkCookie> *listCookie = new QList<QNetworkCookie>();
listCookie->push_back(QNetworkCookie("apiKey",QString("eyJhbGcioiJIUzI").toUtf8()));
QNetworkCookieJar *jar = new QNetworkCookieJar();
jar->setCookiesFromUrl(*listCookie, url);
m_NetworkAccess ->setCookieJar(jar);
...
m_NetworkAccess->post();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)