QT网络请求类封装

  • 头文件
#ifndef NETWORKHELPER_H
#define NETWORKHELPER_H

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

typedef void (*ReceiveFun)(int code, 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 executeGet();
    void executePost();
    void executePostJson();

private:
    QNetworkAccessManager* m_pNetworkAccessManager;
    QTimer* m_pTimer;
    QString m_url;
    QString m_content;
    ReceiveFun m_receiver;
    void* m_pCusData;
    int m_timeout;

signals:

public slots:
};

#endif // NETWORKHELPER_H

  • 源文件
#include "NetworkHelper.h"
#include "const/EnumData.h"
#include <QDebug>

/**
 * @brief   网络通讯辅助类构造函数
 * @author  Robin
 * @date    2020-02-25
 * @param   url
 * @param   content
 * @param   receiver
 * @param   pCusData
 * @param   timeout
 */
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()) );
}

/**
 * @brief   网络通讯辅助类析构函数
 * @author  Robin
 * @date    2020-02-25
 */
NetworkHelper::~NetworkHelper()
{
    m_pNetworkAccessManager->deleteLater();
    m_pTimer->deleteLater();
}

/**
 * @brief   GET方法请求数据
 * @author  Robin
 * @date    2020-02-25
 * @param   url
 * @param   receiver
 * @param   data
 * @param   timeout
 */
void NetworkHelper::get(const QString &url, ReceiveFun receiver, void *data, int timeout)
{
    NetworkHelper* p = new NetworkHelper(url, "", receiver, data, timeout);
    p->executeGet();
}

/**
 * @brief   POST方法请求数据
 * @author  Robin
 * @date    2020-02-25
 * @param   url
 * @param   content
 * @param   receiver
 * @param   data
 * @param   timeout
 */
void NetworkHelper::post(const QString &url, const QString &content, ReceiveFun receiver, void *data, int timeout)
{
    NetworkHelper* p = new NetworkHelper(url, content, receiver, data, timeout);
    p->executePost();
}

/**
 * @brief   使用POST方法发送JSON数据
 * @author  Robin
 * @date    2020-02-25
 * @param   url
 * @param   content
 * @param   receiver
 * @param   timeout
 */
void NetworkHelper::postJson(const QString &url, const QString &content, ReceiveFun receiver, int timeout)
{
    NetworkHelper* p = new NetworkHelper(url, content, receiver, NULL, timeout);
    p->executePostJson();
}

/**
 * @brief   接口响应槽函数
 * @author  Robin
 * @date    2020-02-25
 * @param   reply
 */
void NetworkHelper::OnReplyFinished(QNetworkReply *reply)
{
    m_pTimer->stop();
    if (reply->error() == QNetworkReply::NoError)
    {
        QByteArray bytes = reply->readAll();
        if (m_receiver)
        {
            m_receiver(NetworkReply::ok, bytes, m_pCusData);
        }
    }
    else
    {
        if (m_receiver)
        {
            m_receiver(NetworkReply::error, QByteArray(), m_pCusData);
        }
    }
    reply->deleteLater();
    this->deleteLater();
}

/**
 * @brief   定时器响应槽函数
 * @author  Robin
 * @date    2020-02-25
 */
void NetworkHelper::OnTimer()
{
    m_pTimer->stop();
    if (m_receiver)
    {
        // 超时
        m_receiver( NetworkReply::timeout, QByteArray(), m_pCusData);
    }
    this->deleteLater();
}

/**
 * @brief   执行GET请求
 * @author  Robin
 * @date    2020-02-25
 */
void NetworkHelper::executeGet()
{
    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);
}

/**
 * @brief   执行POST请求
 * @author  Robin
 * @date    2020-02-25
 */
void NetworkHelper::executePost()
{
    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);
}

/**
 * @brief   执行发送JSON数据
 * @author  Robin
 * @date    2020-02-25
 */
void NetworkHelper::executePostJson()
{
    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);
}

完整的类已经放出,转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

  • 我还是不希望你就此离开 我的世界早已被你占据 你要走,就带走我的灵魂 别丢下 任由她飘荡在尘世间
    若琼阅读 204评论 0 2
  • 为什么要写博客,原因大概有这么几条: 经常关注一些大咖的博客,感觉写的不错。当然有的写的也不好,但是经过几年后,断...
    成功在于实践阅读 93评论 0 0
  • 2015年的那个夏天 对于很多人来说,2015年的那个夏天只是一个普通的夏天。对于我来说,那是一个不同寻常的...
    黄小黑阅读 676评论 2 6
  • 感谢生命中带来信息,他们总是在最适合的时间点出现,让我可以有很多的正能量看到生活美好的一面。我的下一个deadli...
    T总去哪里了阅读 277评论 2 0
  • “选择恐惧症”又犯了 这病如同瘟疫一般,毫无声息、防不胜防的蔓延开来 关键影响你在各大购物app秒杀的速度 小编告...
    爱吃芝士阅读 250评论 0 1