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)文章
Pipes實現(xiàn)LeetCode(193.驗證電話號碼)
這篇文章主要介紹了Pipes實現(xiàn)LeetCode(193.驗證電話號碼),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08簡單對比C語言中的fputs()函數(shù)和fputc()函數(shù)
這篇文章主要介紹了簡單對比C語言中的fputs()函數(shù)和fputc()函數(shù),注意其之間的區(qū)別,需要的朋友可以參考下2015-08-08C++string中的insert()插入函數(shù)詳解
這篇文章主要介紹了C++string中的insert()插入函數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03在vscode中快速新建html文件的2種方法總結(jié)
這篇文章主要給大家介紹了關(guān)于在vscode中快速新建html文件的2種方法,以及如何快速打開HTML文件查看編輯效果的方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-04-04一步步從底層入手搞定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