基于 单例模式的 Qt http协议 接口封装

本文介绍了一种HTTP请求处理机制的实现方式,包括GET和POST请求的发送,并通过线程监听来处理网络请求的超时情况。此外,还展示了如何使用这些封装好的类来执行简单的业务逻辑操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,单纯的http 协议访问,不涉及到 具体业务逻辑。采用 单利模式。

 

#ifndef PVHTTP_H
#define PVHTTP_H

 
#include "../pvcore_global.h"
#include <QByteArray>
#include <QNetworkReply>
#include <QThread>
#include <QEventLoop>
#include <QTimer>

 
class NetDataListenerThread:public QThread
{
    Q_OBJECT
public:
    NetDataListenerThread(QNetworkAccessManager *manager,QNetworkReply * reply,int timeoutms,QObject *parent = 0);
    ~NetDataListenerThread();
    QByteArray getBa() const;
    bool getIsWaitTimeOut() const;

 
protected:
    virtual void run();
private:
    bool waitForConnect();
protected slots:
    void slot_waitTimeout();

 
signals:
    void sig_waitTimeout();
private:
    QNetworkAccessManager *mManager;
    int m_TimeOutms;
    bool m_waitTimeOut;
    bool m_isWaitTimeOut;
    QNetworkReply * m_reply;
};

 
class   WebServiceHelp:public QObject
{
    Q_OBJECT
private:
    class Dispose
    {
    public:
        ~Dispose();
    };
public:
    static WebServiceHelp * getInstance();
    ~WebServiceHelp();

 
public:
    /**
     * @brief sendGetRequest 发送Get请求
     * @param urlStr  url
     * @param ba      返回数据
     * @param timeOutms 超时时间
     * @return  返回错误代码
     */
    QNetworkReply::NetworkError sendGetRequest(QString urlStr, QByteArray & ba, int timeOutms=3000);

 
    /**
     * @brief sendPostRequest 发送post请求
     * @param website  网址
     * @param methodName 方法名称
     * @param param 参数
     * @param postBa    post数据
     * @param code      返回代码
     * @param message   返回信息
     * @param data      返回数据
     * @param timeOutms 超时时间
     * @return 返回错误代码
     */
    QNetworkReply::NetworkError sendPostRequest(QString website,const QByteArray & postBa, QByteArray& retBa, int timeOutms=3000);

 
protected slots:
    void slot_error(QNetworkReply::NetworkError code);
private:
    static WebServiceHelp * serverHelp;
    static WebServiceHelp::Dispose disp;
    QNetworkAccessManager *manager;
    QNetworkReply::NetworkError m_errCode;
private:
    WebServiceHelp(QObject *parent=0);

 
};

 
#endif // PVHTTP_H

 

 

 

#include "http.h"
#include "algorithm.h"
#include <QNetworkReply>

 
NetDataListenerThread::NetDataListenerThread(QNetworkAccessManager *manager, QNetworkReply *reply, int timeoutms, QObject *parent)
    :QThread(parent),mManager(manager),m_TimeOutms(timeoutms),m_reply(reply)
{
    m_waitTimeOut = false;
    m_isWaitTimeOut = false;
}

 
NetDataListenerThread::~NetDataListenerThread()
{
}

 
void NetDataListenerThread::run()
{
    m_isWaitTimeOut = waitForConnect();
}

 
bool NetDataListenerThread::waitForConnect()
{
    QEventLoop eventLoop;
    QTimer * timer = NULL;
    m_waitTimeOut = false;
    bool bWaitTimeOut = false;
    if (m_TimeOutms > 0)
    {
        timer = new QTimer;
        connect(timer, SIGNAL(timeout()), this, SLOT(slot_waitTimeout()));
        timer->setSingleShot(true);
        timer->start(m_TimeOutms);

 
        connect(this, SIGNAL(sig_waitTimeout()), &eventLoop, SLOT(quit()));
    }
    connect(mManager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit()));

 
    if (m_reply != NULL)
    {
        connect(m_reply, SIGNAL(readyRead()), &eventLoop, SLOT(quit()));
    }
    eventLoop.exec();

 
    if (timer != NULL)
    {
        timer->stop();
        delete timer;
        timer = NULL;
    }
    bWaitTimeOut = m_waitTimeOut;
    m_waitTimeOut = false;
    return !bWaitTimeOut;
}

 
void NetDataListenerThread::slot_waitTimeout()
{
    m_waitTimeOut = true;
    emit sig_waitTimeout();
}

 

 
bool NetDataListenerThread::getIsWaitTimeOut() const
{
    return m_isWaitTimeOut;
}

 
WebServiceHelp * WebServiceHelp::serverHelp = NULL;
WebServiceHelp::Dispose WebServiceHelp::disp;

 
WebServiceHelp::WebServiceHelp(QObject *parent):QObject(parent)
{
    manager = new QNetworkAccessManager();
    m_errCode= QNetworkReply::NoError;
}

 
WebServiceHelp::~WebServiceHelp()
{
    manager->deleteLater();

 
}

 
WebServiceHelp *WebServiceHelp::getInstance()
{
    if(serverHelp==NULL)
    {
        serverHelp = new WebServiceHelp();
    }
    return serverHelp;
}

 
QNetworkReply::NetworkError WebServiceHelp::sendGetRequest(QString urlStr, QByteArray & ba,int timeOutms)
{
    QNetworkReply::NetworkError retError = QNetworkReply::NoError;
    m_errCode= QNetworkReply::NoError;
    QNetworkRequest request;
    QUrl url(urlStr);
    request.setUrl(url);
    QNetworkReply *reply = manager->get(request);

 
    connect(reply,static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),this,&WebServiceHelp::slot_error);
    QEventLoop eventLoop;
    NetDataListenerThread * thread = new NetDataListenerThread(manager,reply,timeOutms);
    connect(thread, &NetDataListenerThread::finished,&eventLoop,&QEventLoop::quit);
    thread->start();
    eventLoop.exec();
    if(thread->getIsWaitTimeOut())
    {
        ba = reply->readAll();
    }
    else
    {
        m_errCode=QNetworkReply::TimeoutError;
    }
    thread->deleteLater();
    delete reply;
    delete thread;
    thread = NULL;
    retError = m_errCode;
    m_errCode= QNetworkReply::NoError;
    return retError;
}

 
QNetworkReply::NetworkError WebServiceHelp:: sendPostRequest(QString website, const QByteArray &postBa, QByteArray &retBa, int timeOutms)
{
    QString urlStr =website;

 
    QNetworkReply::NetworkError retError = QNetworkReply::NoError;
    m_errCode= QNetworkReply::NoError;
    QNetworkRequest request;

 
    QSslConfiguration config;
    config.setPeerVerifyMode(QSslSocket::VerifyNone);
    config.setProtocol(QSsl::TlsV1SslV3);
    request.setSslConfiguration(config);

 
    QUrl url(urlStr);
    request.setUrl(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
    request.setHeader(QNetworkRequest::ContentLengthHeader,postBa.length());
    QNetworkReply *reply = manager->post(request,postBa);

 
    connect(reply,static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),this,&WebServiceHelp::slot_error);

 

 
    QEventLoop eventLoop;
    NetDataListenerThread * thread = new NetDataListenerThread(manager,reply,timeOutms);
    connect(thread, &NetDataListenerThread::finished,&eventLoop,&QEventLoop::quit);
    thread->start();
    eventLoop.exec();

 
    if(thread->getIsWaitTimeOut())
    {
        retBa = reply->readAll();
    }
    else
    {
        m_errCode=QNetworkReply::TimeoutError;
    }
    thread->deleteLater();
    delete reply;
    delete thread;
    thread = NULL;
    retError = m_errCode;
    m_errCode= QNetworkReply::NoError;
    return retError;
}

 
void WebServiceHelp::slot_error(QNetworkReply::NetworkError code)
{
    m_errCode = code;
}

 
WebServiceHelp::Dispose::~Dispose()
{
    if(WebServiceHelp::serverHelp!=NULL)
    {
        delete WebServiceHelp::serverHelp;
        WebServiceHelp::serverHelp=NULL;
    }
}

 

2,调用以上  对象,对业务逻辑 进行封装,并对http的返回值进行判断。对外 提供 具有结果的接口函数

 

 /*
    *@brief  设置单张拍照模式
    *@return bool 指令是否执行成功
    */
    bool setPhotoMode();

 

 


 
QString url:具体的 url

 

bool HiCamera::setPhotoMode()
{
    QString url = QString("%1/xxxxxxxxxxxxxxxxxx").arg(c_url);
    if(sendGetRequest(url).contains("Success",Qt::CaseInsensitive))
        return true;
    else
        return false;
}

 

 

QString HiCamera::sendGetRequest(QString url)
{
    QByteArray ba;
    QNetworkReply::NetworkError ret=WebServiceHelp::getInstance()->sendGetRequest(url,ba);
    if(ret==QNetworkReply::NoError)
    {
        qDebug()<<"sendGetRequest"<<QString(ba);
        return QString(ba);
    }
    else
    {
        return QStringLiteral("网络%1 错误,请检查网络!").arg(url);
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土拨鼠不是老鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值