QT5(9)HTTP POST GET COOKIE 网络编程 Fiddler代理

应用篇

一、主要使用到的类

#include  //链接网络
#include  //处理接收数据
#include  //处理请求数据
#include  //单个cookie
#include  //储存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);

你可能感兴趣的:(qt)