QT实现自定义Http客户端的示例代码

 更新时间:2022年11月21日 11:17:47   作者:音视频开发老舅  
这篇文章主要为大家详细介绍了QT如何实现自定义Http客户端的,可以实现支持get,post请求方式;支持连接超时处理;支持网络错误,尝试重连等功能,感兴趣的小伙伴可以学习一下

1.Http客户端功能

1.支持get,post请求方式.

2.支持连接超时处理.

3.支持网络错误,尝试重连.

2.源码

HttpClient.h

//HttpClient.h
 
#ifndef HTTPCLIENT_H
#define HTTPCLIENT_H
 
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QEventLoop>
#include <QTimer>
#include <QTextCodec>
 
class HttpClient : public QObject
{
    Q_OBJECT
public:
    explicit HttpClient(QObject *parent = nullptr);
    ~HttpClient();
 
    static HttpClient *getInstance()
    {
        static HttpClient m_instance;
        return &m_instance;
    }
 
    bool get(QNetworkRequest request);
 
    bool post(QNetworkRequest request, const QByteArray &data);
 
    QString errorCode() const;
 
    QString text() const;
 
private:
    void processReply(QNetworkReply *reply);
 
private:
    QNetworkAccessManager		*m_networkAccessManager = nullptr;
    QNetworkReply::NetworkError  m_error;
    QString						 m_text; // 存放网络请求返回的文本字符串
    QString						 m_errorString;//存放错误信息
    int							 m_networkErrorRetry = 0;    // 网络错误重试次数
    QEventLoop					 m_eventLoop;
    QTimer                      *m_timer = nullptr;
    QByteArray				     m_data; // 存放网络请求返回的原始数据
};
 
#endif // HTTPCLIENT_H

HttpClient.cpp

#include "HttpClient.h"
 
HttpClient::HttpClient(QObject *parent)
    : QObject(parent)
{
    m_networkAccessManager = new QNetworkAccessManager(this);
 
    m_timer = new QTimer(this);
    m_timer->setInterval(3000);
    m_timer->setSingleShot(true);
    connect(m_timer, SIGNAL(timeout()), &m_eventLoop, SLOT(quit()));
}
 
HttpClient::~HttpClient()
{
 
}
 
 
bool HttpClient::get(QNetworkRequest request)
{
    QNetworkReply *reply;
    bool success = false;
    request.setPriority(QNetworkRequest::HighPriority);
    for(int i = 0 ; i < m_networkErrorRetry + 1; i++)//
    {
        reply = m_networkAccessManager->get(request);
        processReply(reply);
        if (m_error == QNetworkReply::NoError)
        {
            success = true;
            break;
        }
    }
    return success;
}
 
bool HttpClient::post(QNetworkRequest request, const QByteArray &data)
{
    QNetworkReply *reply;
    bool success = false;
    request.setPriority(QNetworkRequest::HighPriority);
    for (int i = 0; i < m_networkErrorRetry + 1; i++)
    {
        reply = m_networkAccessManager->post(request, data);
        processReply(reply);
        if (m_error == QNetworkReply::NoError)
        {
            success = true;
            break;
        }
    }
    return success;
}
 
void HttpClient::processReply(QNetworkReply *reply)
{
    connect(reply, SIGNAL(finished()), &m_eventLoop, SLOT(quit()));
 
    m_text.clear();
    m_timer->start();
    m_eventLoop.exec();
 
    if (m_timer->isActive())
    {
        m_timer->stop();
 
        m_error = reply->error();
        m_errorString = reply->errorString();
        if (reply->bytesAvailable() > 0)
        {
            m_data = reply->readAll();
            QTextCodec *codec = QTextCodec::codecForHtml(m_data, QTextCodec::codecForName("utf-8"));
            if (codec)
                m_text = codec->toUnicode(m_data);
        }
        else
        {
            m_data.clear();
            m_text.clear();
        }
    }
    else
    {
        reply->abort();
        m_error = QNetworkReply::TimeoutError;
    }
 
    delete reply;
}
 
QString HttpClient::errorCode() const
{
    switch (m_error)
    {
        case QNetworkReply::NoError: return "NoError";
        case QNetworkReply::ConnectionRefusedError: return "ConnectionRefusedError";
        case QNetworkReply::RemoteHostClosedError: return "RemoteHostClosedError";
        case QNetworkReply::HostNotFoundError: return "HostNotFoundError";
        case QNetworkReply::TimeoutError: return "TimeoutError";
        case QNetworkReply::OperationCanceledError: return "OperationCanceledError";
        case QNetworkReply::SslHandshakeFailedError: return "SslHandshakeFailedError";
        case QNetworkReply::TemporaryNetworkFailureError: return "TemporaryNetworkFailureError";
        case QNetworkReply::ProxyConnectionRefusedError: return "ProxyConnectionRefusedError";
        case QNetworkReply::ProxyConnectionClosedError: return "ProxyConnectionClosedError";
        case QNetworkReply::ProxyNotFoundError: return "ProxyNotFoundError";
        case QNetworkReply::ProxyTimeoutError: return "ProxyTimeoutError";
        case QNetworkReply::ProxyAuthenticationRequiredError: return "ProxyAuthenticationRequiredError";
        case QNetworkReply::ContentAccessDenied: return "ContentAccessDenied";
        case QNetworkReply::ContentOperationNotPermittedError: return "ContentOperationNotPermittedError";
        case QNetworkReply::ContentNotFoundError: return "ContentNotFoundError";
        case QNetworkReply::AuthenticationRequiredError: return "AuthenticationRequiredError";
        case QNetworkReply::ContentReSendError: return "ContentReSendError";
        case QNetworkReply::ProtocolUnknownError: return "ProtocolUnknownError";
        case QNetworkReply::ProtocolInvalidOperationError: return "ProtocolInvalidOperationError";
        case QNetworkReply::UnknownNetworkError: return "UnknownNetworkError";
        case QNetworkReply::UnknownProxyError: return "UnknownProxyError";
        case QNetworkReply::UnknownContentError: return "UnknownContentError";
        case QNetworkReply::ProtocolFailure: return "ProtocolFailure";
    }
    return "UnknownError";
}
 
QString HttpClient::text() const
{
    return m_text;
}

3.使用方式

#include <QCoreApplication>
#include "HttpClient.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    QNetworkRequest request;
    request.setUrl(QUrl("http://www.baidu.com"));
    request.setRawHeader("Content-Type", "application/json");
    if(HttpClient::getInstance()->get(request))
    {
        qDebug()<<HttpClient::getInstance()->text();
    }
    else
    {
        qDebug()<<HttpClient::getInstance()->errorCode();
    }
 
 
    return a.exec();
}

以上就是QT实现自定义Http客户端的示例代码的详细内容,更多关于QT自定义Http客户端的资料请关注脚本之家其它相关文章!

相关文章

  • C++程序自动重启的实现代码

    C++程序自动重启的实现代码

    自动重启原理很简单,用一个进程监控另一个进程,挂了就再启动一个,细节也不算多,主要是正确判断进程状态和启动方式,本文就给大家讲讲C++程序自动重启的实现方法,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-04-04
  • 详解C++17中nodiscard标记符的使用

    详解C++17中nodiscard标记符的使用

    在C++ 17中引入了一个标记符nodiscard,用于声明一个 “非弃值(no-discard)表达式”。这篇文章就来和大家来聊一聊nodiscard标记符的使用吧
    2023-02-02
  • C++实现的打字母游戏示例

    C++实现的打字母游戏示例

    这篇文章主要介绍了C++实现的打字母游戏,涉及C++字体操作、时间及键盘响应相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • C语言中读写交替时出现的问题分析

    C语言中读写交替时出现的问题分析

    读写命令交替,一定要使用fseek重新定位,否则出现输入显示混乱,这篇文章主要介绍了C语言中读写交替时出现的问题分析,需要的朋友可以参考下
    2022-12-12
  • C语言实现简单通讯录

    C语言实现简单通讯录

    这篇文章主要为大家详细介绍了C语言实现简易通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • dword ptr指令详细解析

    dword ptr指令详细解析

    8086CPU的指令,可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作
    2013-09-09
  • C++深入探究友元使用

    C++深入探究友元使用

    采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数
    2022-07-07
  • C++获取MD5算法实现代码

    C++获取MD5算法实现代码

    这篇文章主要介绍了C++获取MD5算法实现代码,这个是网上扒下来的 作者已经无法知道是谁了 ,可以备用
    2019-04-04
  • C语言实现游戏VIP停车场管理系统

    C语言实现游戏VIP停车场管理系统

    这篇文章主要介绍了C语言实现游戏VIP停车场管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C++ Coroutine简单学习教程

    C++ Coroutine简单学习教程

    这篇文章主要为大家详细介绍了C++ Coroutine的简单学习教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论