網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1.Http客戶(hù)端功能
1.支持get,post請(qǐng)求方式.
2.支持連接超時(shí)處理.
3.支持網(wǎng)絡(luò)錯(cuò)誤,嘗試重連.
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)絡(luò)請(qǐng)求返回的文本字符串
QString m_errorString;//存放錯(cuò)誤信息
int m_networkErrorRetry = 0; // 網(wǎng)絡(luò)錯(cuò)誤重試次數(shù)
QEventLoop m_eventLoop;
QTimer *m_timer = nullptr;
QByteArray m_data; // 存放網(wǎng)絡(luò)請(qǐ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();
}
原文鏈接:https://blog.csdn.net/m0_60259116/article/details/127941863
相關(guān)推薦
- 2024-01-07 使用 SpringSecurity 發(fā)送POST請(qǐng)求出現(xiàn) 403
- 2022-03-21 C語(yǔ)言動(dòng)態(tài)內(nèi)存管理介紹_C 語(yǔ)言
- 2023-06-17 C語(yǔ)言string庫(kù)strcpy、strcmp、strcat函數(shù)的使用_C 語(yǔ)言
- 2022-08-14 Python基礎(chǔ)教程之pip的安裝和卸載_python
- 2023-06-05 C++兩個(gè)cpp文件間如何進(jìn)行各自函數(shù)的調(diào)用方式_C 語(yǔ)言
- 2022-08-13 IDEA快速展開(kāi)和折疊方法代碼快捷鍵
- 2022-04-11 Xamarin.Forms在安卓機(jī)上進(jìn)行本機(jī)調(diào)試_實(shí)用技巧
- 2022-03-28 C語(yǔ)言實(shí)現(xiàn)紅黑樹(shù)詳細(xì)步驟+代碼_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支