/*
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
Qt写的http请求类
最新推荐文章于 2024-09-06 16:14:05 发布