Qt写的http请求类

/*
    Copyright: YiChen

    Contact email: 317090996@qq.com
*/

#ifndef YCHTTP_H
#define YCHTTP_H
#pragma execution_character_set("utf-8")
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QThread>
#include <QEventLoop>
#include <QNetworkCookie>
#include <QNetworkCookieJar>
#include <QtConcurrent>
#include "yctools.h"
//#include "YCGzip.h"
class YCCookieJar;
//不同网站 不同请求头
enum YCHeaderIndex{
    URL2_None = 0,
    URL2_GetDefaut = 1,     //
    URL2_PostDefaut = 2,    //最常用
    URL2_PostJson ,         //JsonObject
    URL2_PostXml ,
    URL2_PostZip ,
    URL2_PostPlainText ,
    URL2_PostHtml ,
    URL2_PostPng  ,
    URL2_PostJpg  ,
    URL2_VerifyCode,      //https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand+13位数字
    URL2_TestHeader,         //测试请求header头
    URL2_JD,
    URL2_m_header
};

//请求方式,之所以使用宏定义是因为方便信号传输
#define     YCHTTP_POST_BYTE         1
#define     YCHTTP_GET               2
#define     YCHTTP_PUT               3
#define     YCHTTP_DELETE            4
#define     YCHTTP_POST_MULTI        5
#define     YCHTTP_POST_IODEVICE     6
#define     YCHTTP_PUT_MULTI         7
#define     YCHTTP_PUT_IODEVICE      8

class YCHttp : public QObject
{
    Q_OBJECT
public:
    explicit YCHttp(QObject *parent = nullptr);

    //URL2_None时会自动添加 User-Agent:Mozilla/5.0  Accept-Language:zh-CN,en,*
    //Accept-Encoding:gzip, deflate    Connection:Keep-Alive     Host => localhost:88
    bool get(const QString &url,QString &responseData, YCHeaderIndex nIndex = URL2_None,int nTimeOut = 10*1000);
    bool get(const QString &url,QByteArray &responseByte, YCHeaderIndex nIndex = URL2_None,int nTimeOut = 10*1000);
    bool getImage(const QString &url, QPixmap &responseData, YCHeaderIndex nIndex = URL2_None, QString postData = "", int nTimeOut = 10*1000);

    bool post(const QString &url,QByteArray &postByte,QByteArray &responseByte, YCHeaderIndex nIndex = URL2_PostDefaut,int nTimeOut = 10*1000);
    bool post(const QString &url,QString &postData,QString &responseData, YCHeaderIndex nIndex = URL2_PostDefaut,int nTimeOut = 10*1000);
    bool post(const QString &url,const QUrlQuery &query,QString &responseData, YCHeaderIndex nIndex = URL2_PostDefaut,int nTimeOut = 10*1000);
    bool post(const QString &url,const QUrlQuery &query,QByteArray &responseByte, YCHeaderIndex nIndex = URL2_PostDefaut,int nTimeOut = 10*1000);
    bool post(const QString &url,const QSharedPointer<QIODevice> &ioDevice, QString &responseData, YCHeaderIndex nIndex = URL2_PostDefaut,int nTimeOut = 10*1000);
    bool post(const QString &url,const QSharedPointer<QHttpMultiPart> &multiPart, QString &responseData, YCHeaderIndex nIndex = URL2_PostDefaut,int nTimeOut = 10*1000);

    bool download(const QString &url, const QString &savePath,  QString postData = "", YCHeaderIndex nIndex = URL2_None, int nTimeOut = 60*1000);
    bool downloadThread(const QString &url, const QString &savePath,  QString postData = "", YCHeaderIndex nIndex = URL2_None, int nTimeOut = 60*60*1000);

    //QNetworkProxy::HttpProxy  QNetworkProxy::Socks5Proxy  QNetworkProxy::NoProxy
    void setProxy(const QString &hostname, const quint16 &port, QNetworkProxy::ProxyType type = QNetworkProxy::Socks5Proxy,
                  const QString &user = "", const QString &password = "");
    bool httpRequest(const QString& strUrl, int nHttpType = YCHTTP_POST_BYTE, const QByteArray& bytePost = QByteArray(), YCHeaderIndex nIndex = URL2_None,
                     int nTimeOut = 10*1000,const QSharedPointer<QIODevice> &ioDevice = nullptr,const QSharedPointer<QHttpMultiPart> &multiPart = nullptr);
    void urlEncode(QString &strSrc);
    //设置和获取cookie
    void removeCookie(const QNetworkCookie &netCookie);
    void removeAllCookie();
    void setCookie(const QNetworkCookie &netCookie);
    void setCookie(const QString &name,const QString &value, const QString &url = "http://localhost");
    void setCookies(const QList<QNetworkCookie>& cookieList,const QString &url = "http://localhost");
    void setTotalCookies(const QList<QNetworkCookie>& cookieList);    
    QList<QNetworkCookie> getTotalCookies();
    YCCookieJar *getCookieJar();
    //手动设置m_header,m_header.pushback(referer : https://item.jd.com/897622.html)
    QStringList m_header;
    QVariant m_statusCode;
protected:
Q_SIGNALS:
    void signal_downloadFinish(bool bSuccess, const QString &url, const QString &savePath);
    void signal_downloadProgress(qint64,qint64);
private slots:

private:
    bool getHttpStatusCode(QNetworkReply* networkReply, QByteArray& replyByteArray);
    //
    void setHeader(QNetworkRequest &reqData, YCHeaderIndex nIndex)
    {//不要手动添加"Accept-Encoding","gzip, deflate, br",Qt会自动添加并解压
     //不要手动添加"Content-Length"  Qt会自动添加
     //自动添加Host:
     //默认自动添加Accept-Language:zh-CN,en,*
     //Connection:Keep-Alive
     //User-Agent:Mozilla/5.0
        switch(nIndex)
        {
        case URL2_None:
            break;
        case URL2_TestHeader:
            reqData.setRawHeader("Host","www.baidu.com");
            reqData.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36");
            break;
        case URL2_GetDefaut:
            reqData.setRawHeader("User-Agent","Mozilla/5.0");
            break;
        case URL2_PostDefaut:
            reqData.setRawHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
            break;
        case URL2_PostJson:
            reqData.setRawHeader("Content-Type", "application/json");
            break;
        case URL2_PostXml:
            reqData.setRawHeader("Content-Type", "application/xml");
            break;
        case URL2_PostZip:
            reqData.setRawHeader("Content-Type", "application/zip");
            break;
        case URL2_PostPlainText:
            reqData.setRawHeader("Content-Type", "text/plain");
            break;
        case URL2_PostHtml:
            reqData.setRawHeader("Content-Type", "text/html");
            break;
        case URL2_PostPng:
            reqData.setRawHeader("Content-Type", "image/png");
            break;
        case URL2_PostJpg:
            reqData.setRawHeader("Content-Type", "image/jpg");
            break;
        case URL2_VerifyCode:    //12306
            reqData.setRawHeader("Referer", "https://kyfw.12306.cn/otn/login/init");
            reqData.setRawHeader("Connection", "keep-alive");
            reqData.setRawHeader("Accept","application/json, text/javascript,*/*; q=0.8");
            reqData.setRawHeader("Accept-Encoding","gzip, deflate, br");
            reqData.setRawHeader("Accept-Language","zh-CN,zh;q=0.8");
            reqData.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36");
            break;
        case URL2_JD:
            reqData.setRawHeader("referer", "https://item.jd.com/897622.html");
            break;
        case URL2_m_header:
        {
            for(auto str : m_header){
                QString first = str.left(str.indexOf(":")).trimmed();
                QString second = str.right(str.length() - str.indexOf(":") - 1).trimmed();
                //qDebug() << "first:" << first;
                //qDebug() << "second:" << second;
                reqData.setRawHeader(first.toLocal8Bit(), second.toLocal8Bit());
            }
            break;
        }
        default:
            break;
        }
    }

    QNetworkAccessManager *m_http = nullptr;
    QByteArray m_byteReturn;//QNetworkReply返回数据
    bool m_bReturn;//QNetworkReply返回是否成功    
    YCCookieJar *m_cookieJar = nullptr;
    QMutex m_mutex;
};


class YCCookieJar : public QNetworkCookieJar
{
    Q_OBJECT

public:
    explicit YCCookieJar(QObject *parent = 0);
    ~YCCookieJar();
    QList<QNetworkCookie> cookies();
    void removeCookie(const QNetworkCookie &netCookie);
    void removeAllCookie();
    void setCookie(const QNetworkCookie &netCookie);
    void setCookie(const QString &name,const QString &value, const QString &url);
    void setCookies(const QList<QNetworkCookie>& cookieList,const QString &url);
    void setTotalCookies(const QList<QNetworkCookie>& cookieList);
private:
    QList<QNetworkCookie> m_listCookie;
};

#endif // YCHTTP_H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值