欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

QT實現(xiàn)自定義Http客戶端的示例代碼

 更新時間:2022年11月21日 11:17:47   作者:音視頻開發(fā)老舅  
這篇文章主要為大家詳細介紹了QT如何實現(xiàn)自定義Http客戶端的,可以實現(xiàn)支持get,post請求方式;支持連接超時處理;支持網(wǎng)絡錯誤,嘗試重連等功能,感興趣的小伙伴可以學習一下

1.Http客戶端功能

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

2.支持連接超時處理.

3.支持網(wǎng)絡錯誤,嘗試重連.

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; // 存放網(wǎng)絡請求返回的文本字符串
    QString						 m_errorString;//存放錯誤信息
    int							 m_networkErrorRetry = 0;    // 網(wǎng)絡錯誤重試次數(shù)
    QEventLoop					 m_eventLoop;
    QTimer                      *m_timer = nullptr;
    QByteArray				     m_data; // 存放網(wǎng)絡請求返回的原始數(shù)據(jù)
};
 
#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實現(xiàn)自定義Http客戶端的示例代碼的詳細內(nèi)容,更多關(guān)于QT自定義Http客戶端的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用c語言實現(xiàn)卷積碼編碼器示例

    利用c語言實現(xiàn)卷積碼編碼器示例

    這篇文章主要介紹了利用c語言實現(xiàn)卷積碼編碼器示例,需要的朋友可以參考下
    2014-03-03
  • C語言開發(fā)之歸并排序詳解及實例

    C語言開發(fā)之歸并排序詳解及實例

    這篇文章主要介紹了 C語言開發(fā)之歸并排序詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Pipes實現(xiàn)LeetCode(193.驗證電話號碼)

    Pipes實現(xiàn)LeetCode(193.驗證電話號碼)

    這篇文章主要介紹了Pipes實現(xiàn)LeetCode(193.驗證電話號碼),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++語言基礎 this和static關(guān)鍵字

    C++語言基礎 this和static關(guān)鍵字

    這篇文章主要介紹了C++語言基礎 this和static關(guān)鍵字,需要的朋友可以參考下
    2020-01-01
  • 簡單對比C語言中的fputs()函數(shù)和fputc()函數(shù)

    簡單對比C語言中的fputs()函數(shù)和fputc()函數(shù)

    這篇文章主要介紹了簡單對比C語言中的fputs()函數(shù)和fputc()函數(shù),注意其之間的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • C++string中的insert()插入函數(shù)詳解

    C++string中的insert()插入函數(shù)詳解

    這篇文章主要介紹了C++string中的insert()插入函數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 在vscode中快速新建html文件的2種方法總結(jié)

    在vscode中快速新建html文件的2種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于在vscode中快速新建html文件的2種方法,以及如何快速打開HTML文件查看編輯效果的方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • 淺談C++中virtual的三種用法

    淺談C++中virtual的三種用法

    這篇文章主要介紹了淺談C++中virtual的三種用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 一步步從底層入手搞定C++引用與內(nèi)聯(lián)函數(shù)

    一步步從底層入手搞定C++引用與內(nèi)聯(lián)函數(shù)

    內(nèi)聯(lián)函數(shù)是代碼插入到調(diào)用者代碼處的函數(shù),內(nèi)聯(lián)函數(shù)通過避免被調(diào)用的開銷來提高執(zhí)行效率,下面這篇文章主要給大家介紹了關(guān)于如何從底層入手搞定C++引用與內(nèi)聯(lián)函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • c++中string和vector的詳細介紹

    c++中string和vector的詳細介紹

    這篇文章主要介紹了c++中string和vector的詳細介紹,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-09-09

最新評論