一、主要使用到的类
#include <QtNetwork/QNetworkAccessManager> //链接网络
#include <QtNetwork/QNetworkReply> //处理接收数据
#include <QtNetwork/QNetworkRequest> //处理请求数据
#include <QNetworkCookie> //单个cookie
#include <QNetworkCookieJar> //储存cookie
注意:
1、QT的HTTP请求方法都是异步的,如果你要同步可以使用QEventLoop和connect搭配使用实现;如果你要使用异步,那直接使用connect当完成请求时唤醒某个函数。
2、QT获取cookie时使用QNetworkCookieJar类,不过QNetworkCookieJar类获取cookies函数类型为protected。所以我们需要重新声明一个类继承自QNetworkCookieJar类来获取cookie。
二、GET
typedef QPair<QByteArray,QList<QNetworkCookie> > HTTPBACK;
HTTPBACK AccessHttp::get(QString url){
QEventLoop loop;
// 为后期获取cookie
AccessHttp netCookies; //我的类AccessHttp继承了QNetworkCookieJar
QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request;
request.setUrl(url);
manager -> setCookieJar(&netCookies);
QNetworkReply *reply = manager -> get(request);
// qt的http是异步的,为完成同步,使用子事件循环。当完成信息获取,退出子事件。
QObject::connect(reply,SIGNAL(finished()),&loop,SLOT(quit()));
loop.exec();
QByteArray con = reply -> readAll();
QList<QNetworkCookie> cookies = netCookies.allCookies();
return HTTPBACK(con,cookies);
}
三、POST
typedef QPair<QByteArray,QList<QNetworkCookie> > HTTPBACK;
HTTPBACK AccessHttp::post(QString url, QByteArray postData, QList<QNetworkCookie> insertCookie, MAPBYTE headers){
QEventLoop loop;
// 为后期获取cookie
AccessHttp netCookies; //我的类AccessHttp继承了QNetworkCookieJar
QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkRequest request;
request.setUrl(QUrl(url));
//设置头
for(MAPBYTE::iterator it = headers.begin(); it != headers.end(); it++){
request.setRawHeader(it.key(), it.value());
}
// 插入cookie
netCookies.setAllCookies(insertCookie);
manager -> setCookieJar(&netCookies);
QNetworkReply *reply = manager -> post(request,postData);
// qt的http是异步的,为完成同步,使用子事件循环。当完成信息获取,退出子事件。
QObject::connect(reply,SIGNAL(finished()),&loop,SLOT(quit()));
loop.exec();
QByteArray con = reply -> readAll();
QList<QNetworkCookie> cookies = netCookies.allCookies();
return HTTPBACK(con,cookies);
}
四、注意
如果获取到的数据是gzip压缩的,需要引入zlib解析。
四、设置代理用于Fiddler监听
由于Fiddler是设置代理服务器的方式监听,而Qt的http是直连。需要设置一下代理让Fiddler抓取。
QNetworkProxy proxy;
// proxy.setType(QNetworkProxy::Socks5Proxy);
proxy.setType(QNetworkProxy::HttpProxy);
proxy.setHostName("127.0.0.1");
proxy.setPort(8888);
// proxy.setUser("");
// proxy.setPassword("");
QNetworkProxy::setApplicationProxy(proxy);