簡 述: 最近使用網絡,對於請求頭和協議頭,有一處撓頭了下,看到這一篇有些觸發後面實現了,覺得寫得還挺好的,且後面可能正好要改進使用 Cookies
和 ssl
,先擺着在這裏;
所使用的Qt版本:5.14.0
本例子基於這篇博客中的例子:《Qt使用HTTPS協議訪問網站》
接收Cookies:
Cookie由返回的QNetworkReply獲取,Qt已經做得很好了,我們只需要調用相關函數即可,像其他響應消息的頭也可以由類似的方式獲取。
#include <QCoreApplication>
#include "TestNet.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
TestNet One;
One.GetWeb();
return a.exec();
}
//main.cpp
#include <QtNetwork>
#include <iostream>
#include <QFile>
class TestNet : public QObject
{
Q_OBJECT
public:
QNetworkAccessManager *m_manager = NULL;
QNetworkRequest *m_request = NULL;
//訪問網站
void GetWeb()
{
//建立新對象
m_manager = new QNetworkAccessManager();
m_request = new QNetworkRequest(QUrl("https://gitee.com/"));
//設置SSL連接
QSslConfiguration config;
QSslConfiguration conf = m_request->sslConfiguration();
conf.setPeerVerifyMode(QSslSocket::VerifyNone);
conf.setProtocol(QSsl::TlsV1SslV3);
m_request->setSslConfiguration(conf);
//連接槽
QObject::connect(m_manager,&QNetworkAccessManager::finished,this,&TestNet::GetWebFinished);
//發送Get請求
m_manager->get(*m_request);
}
//訪問後做的操作
void GetWebFinished(QNetworkReply *reply)
{
//轉換爲utf-8編碼,這樣就可以顯示中文了
QTextCodec *codec = QTextCodec::codecForName("utf8");
QString getData = codec->toUnicode(reply->readAll());
//獲取Cookies
if(reply->hasRawHeader("Set-Cookie"))
{
QByteArray cookie = reply->rawHeader("Set-Cookie");
std::cout<<cookie.toStdString();
}
}
};
//TestNet.h
發送Cookies:
首先我們先看一下用Fiddler抓包軟件截取的Http請求包。
POST https://gitee.com/check_user_login HTTP/1.1
Host: gitee.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: https://gitee.com/login
X-CSRF-Token: GbYJaqAJEXGRYoNtYXUlzdw06JNrqC1FGO7wJO8L+J8=
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 22
Origin: https://gitee.com
Connection: keep-alive
Cookie: user_locale=zh-CN; oschina_new_user=false; Hm_lvt_24f17767262929947cc3631f99bfd274=1587994350,1587994363,1587994651,1587995075; remote_way=http; gitee-session-n=cVdXY3BBSG91a2JSWXRsR0gybVNZTXB6UUZoZU11dzdnNERRVjJNUmRSUzQ0NzZ5YkFHNjM5cG1Lbk82RHYrclVaQzRURjZIbFRsSGkybm1FQmdVR1M2dFJPZmhFdXNCK0JrRk9DVEVBQXdnVXF2V2tuYWw3aXRURUlEWkV6aXc0VUlwRGtJb1dCd0g2NFVxeW1IMC9MSHU2dnJHck1kY213ZEdDcWFFOU1OZTZtTWdKN1VkYVNTdGxVaUpIMUtpLS02K0Z1VzBFOHQyQ1FXWXpSYlhSZEVBPT0%3D--631c43af162f79e53290d6e86ac1ada72f92ffed; tz=Asia%2FShanghai; Hm_lpvt_24f17767262929947cc3631f99bfd274=1587995076
這是我在登陸Gitee網站時瀏覽器發出的POST請求頭,那麼請問,這個請求頭中有多少個cookie?
答案是:有7個(有多少個等號就有多少個cookie,每個cookie用 ; 分隔開來)
至少按照Qt的方式是這樣理解的(狗頭)
所以,我們一般叫這玩意作:cookies
而每一個cookie有兩個基本屬性,等號之前的屬性名稱爲“name”,等號後面的屬性爲“value”;
代碼如下:
#include <QCoreApplication>
#include "TestNet.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
TestNet One;
One.GetWeb();
return a.exec();
}
//main.cpp
#include <QtNetwork>
#include <iostream>
#include <QFile>
class TestNet : public QObject
{
Q_OBJECT
public:
QNetworkAccessManager *m_manager = NULL;
QNetworkRequest *m_request = NULL;
QList<QNetworkCookie> Web_cookies; //這麼做的意圖很明顯了吧,QNetworkCookie是每一個cookie,QList是cookies
//訪問網站
void GetWeb()
{
//建立新對象
m_manager = new QNetworkAccessManager();
m_request = new QNetworkRequest(QUrl("https://gitee.com/"));
//設置SSL連接
QSslConfiguration config;
QSslConfiguration conf = m_request->sslConfiguration();
conf.setPeerVerifyMode(QSslSocket::VerifyNone);
conf.setProtocol(QSsl::TlsV1SslV3);
m_request->setSslConfiguration(conf);
//設置cookies
Web_cookies.push_back(QNetworkCookie("Name","Value"));
Web_cookies.push_back(QNetworkCookie("Test","Net"));
//向請求頭裏加入cookies
QVariant var;
var.setValue(Web_cookies);
m_request->setHeader(QNetworkRequest::CookieHeader,var);
//連接槽
QObject::connect(m_manager,&QNetworkAccessManager::finished,this,&TestNet::GetWebFinished);
//發送Get請求
m_manager->get(*m_request);
}
//訪問後做的操作
void GetWebFinished(QNetworkReply *reply)
{
//NULL
}
};
//TestNet.h
然後呢,發送的Http請求頭如下:
GET https://gitee.com/ HTTP/1.1
Host: gitee.com
Cookie: Name=Value; Test=Net
Connection: Keep-Alive
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en,*
User-Agent: Mozilla/5.0
有什麼問題就不要留言了,不是我無情,而是我是“全宿制”學生黨,我也很無奈。
參考:
轉載於原文:Qt網絡編程之使用cookie