QNetwork封装的一个get/post类

此代码应该是从Github上借鉴过来的类,封装的不错,可以直接使用get和post请求。也可以实现一些简单的下载请求。

NetworkHelper.h

#ifndef NetworkHelper_h_
#define NetworkHelper_h_

#include <QObject>
#include <QNetworkReply>
#include <QTimer>
#define LimitTimeOut 5000 //请求超时时间(毫秒)

enum E_NetworkReply
{
    E_NetOK,
    E_NetTimeOut,//超时
    E_NetReplyError,
};

typedef void (*ReceiveFun)(int errCode, const QByteArray& bytes, void* pCusData);

class NetworkHelper : public QObject
{
    Q_OBJECT
public:
    static void get(const QString& url, ReceiveFun receiver, void* data, int timeout = LimitTimeOut);
    static void post(const QString& url, const QString& content, ReceiveFun receiver, void* data, int timeout = LimitTimeOut);
    static void postJson(const QString& url, const QString& content, ReceiveFun receiver, int timeout = LimitTimeOut);

private slots:
    void OnReplyFinished(QNetworkReply* reply);
    void OnTimer();

private:
    NetworkHelper(QString url, QString content, ReceiveFun receiver, void* pCusData, int timeout);
    ~NetworkHelper();

    void excuteGet();
    void excutePost();
    void excutePostJson();

private:
    QNetworkAccessManager* m_pNetworkAccessManager;
    QTimer*     m_pTimer;

    QString     m_url;
    QString     m_content;  
    ReceiveFun  m_receiver;
    void*       m_pCusdata;
    int         m_timeout;
};

#endif//NetworkHelper_h_

NetworkHelper.cpp

#include "stdafx.h"
#include "NetworkHelper.h"

NetworkHelper::NetworkHelper(QString url, QString content, ReceiveFun receiver, void* pCusData, int timeout)
{
    m_url = url;
    m_content = content;
    m_receiver = receiver;
    m_pCusdata = pCusData;
    m_timeout = timeout;

    m_pNetworkAccessManager = new QNetworkAccessManager();
    m_pTimer = new QTimer();

    connect( m_pNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(OnReplyFinished(QNetworkReply*)) );
    connect( m_pTimer, SIGNAL(timeout()), this, SLOT(OnTimer()) );
}

NetworkHelper::~NetworkHelper()
{
    SafeDelete(m_pNetworkAccessManager);
    SafeDelete(m_pTimer);
}

void NetworkHelper::get( const QString& url, ReceiveFun receiver, void* data, int timeout /*= LimitTimeOut*/ )
{
    NetworkHelper* p = new NetworkHelper( url, "", receiver, data, timeout );
    p->excuteGet();
}

void NetworkHelper::post( const QString& url, const QString& content, ReceiveFun receiver, void* data, int timeout /*= LimitTimeOut*/ )
{
    NetworkHelper* p = new NetworkHelper( url, content ,receiver, data, timeout );
    p->excutePost();
}

void NetworkHelper::postJson(const QString& url, const QString& content, ReceiveFun receiver, int timeout /*= LimitTimeOut*/)
{
    NetworkHelper* p = new NetworkHelper(url, content, receiver, NULL, timeout);
    p->excutePostJson();
}

void NetworkHelper::OnReplyFinished( QNetworkReply* reply )
{
    m_pTimer->stop();
    if (reply->error() == QNetworkReply::NoError)
    {
        QByteArray bytes = reply->readAll();
        if (m_receiver)
        {
            m_receiver(E_NetOK, bytes, m_pCusdata);
        }
    }
    else
    {
        if (m_receiver)
        {
            m_receiver(E_NetReplyError, QByteArray(), m_pCusdata);
        }
        QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
        qDebug( "found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
        qDebug( qPrintable(reply->errorString()) );
    }
    reply->deleteLater();
    this->deleteLater();
}

void NetworkHelper::OnTimer()
{
    m_pTimer->stop();
    if (m_receiver)
    {
        m_receiver( E_NetTimeOut, QByteArray(), m_pCusdata ); //超时
    }
    this->deleteLater();
}

void NetworkHelper::excuteGet()
{
    QNetworkRequest network_request;
    network_request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");//二进制流类型
    network_request.setUrl( QUrl(m_url) );
    m_pNetworkAccessManager->get(network_request);
    m_pTimer->start(m_timeout);
}

void NetworkHelper::excutePost()
{
    QNetworkRequest network_request;
    network_request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");//二进制流类型
    network_request.setUrl( QUrl(m_url) );
    QByteArray post_data;
    post_data.append(m_content);
    m_pNetworkAccessManager->post(network_request, post_data);
    m_pTimer->start(m_timeout);
}

void NetworkHelper::excutePostJson()
{
    qDebug("~> excutePostJson() url: %s, content: %s", m_url, m_content);

    QNetworkRequest network_request;
    network_request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=utf-8");
    network_request.setUrl(QUrl(m_url));

    //m_content = m_content.toUtf8();

    QByteArray post_data;
    post_data.append(m_content);
    m_pNetworkAccessManager->post(network_request, post_data);
    m_pTimer->start(m_timeout);
}

用法例子:

void MainClass::Test()
{
    NetworkHelper::get(url, [](int errCode, const QByteArray& bytes, void* pCusData)
    {
        if(errCode == E_NetOK)
        {
            QString  platformData = bytes;
            QLOG << platformData;
#if 0   //下载图片用此
            QFile file("D:\\test.png");
            if (file.open(QIODevice::WriteOnly | QIODevice::Append))
            {
                file.write(bytes);
            }
            file.close();
#endif
            //这里之所以要在回调函数中将主类的指针传过来,是因为经过请求后的数据,异步跨线程了
            MainClass* pThis = reinterpret_cast<MainClass*>(pCusData);
            pThis->doSth(platformData);
        }
    }, this, 2000);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值