当前位置: 首页 > news >正文

在 HTTP 请求返回的状态码不为 200 时,重新发送请求

在 HTTP 请求返回的状态码不为 200 时,重新发送请求。我们可以通过检查 HTTP 状态码并在需要时重新发起请求来实现这一点。

这里是一个实现的示例,在 finished 信号的槽函数中判断状态码,如果状态码不为 200,则重新发送请求。

代码实现

// 定义重试次数的最大限制
#define MAX_RETRY_COUNT 3// 当前重试次数
int retryCount = 0;QNetworkReply* sendPostRequest(const QUrl& url, const QByteArray& data) {// 创建新的请求m_postRequest->setUrl(url.isEmpty() ? m_url : url);// 发送 POST 请求QNetworkReply* pReply = m_manager->post(*m_postRequest, data);// 处理请求超时QReplyTimeout *pTimeout = new QReplyTimeout(pReply, POST_TIMEOUT);connect(pReply, &QNetworkReply::finished, [=]() {// 获取 HTTP 状态码int statusCode = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();qDebug() << "HTTP Status Code: " << statusCode;// 如果状态码不是 200,且还没有达到最大重试次数,则重新发送请求if (statusCode != 200 && retryCount < MAX_RETRY_COUNT) {retryCount++;  // 增加重试次数qDebug() << "Retrying... Attempt #" << retryCount;// 重新发送请求sendPostRequest(url, data);} else if (statusCode == 200) {qDebug() << "Request successful!";} else {qDebug() << "Request failed after " << retryCount << " retries.";}// 清理资源pReply->deleteLater();});return pReply;
}

代码说明

  1. 最大重试次数 (MAX_RETRY_COUNT):这里定义了最大重试次数(例如 3 次)。你可以根据需要调整这个值。

  2. 重试逻辑:在 finished 信号的槽函数内:

    • 检查 HTTP 状态码。
    • 如果状态码不是 200 且 retryCount 小于最大重试次数,则增加重试次数,并重新调用 sendPostRequest() 函数来发送请求。
    • 如果状态码为 200,则表示请求成功,打印成功信息。
    • 如果超过最大重试次数仍然没有成功,则打印失败信息。
  3. 递归发送请求:在状态码不为 200 时,我们通过递归调用 sendPostRequest() 来重新发送请求。递归时会增加 retryCount,直到达到最大重试次数。

  4. 资源清理:每次请求完成后都会调用 pReply->deleteLater() 来确保响应对象被正确销毁。

使用方式

假设你需要发送一个 POST 请求,只需调用 sendPostRequest() 函数:

QUrl url("http://your.api.endpoint");
QByteArray data = "your request data";sendPostRequest(url, data);

其他优化

  • 防止无限递归:在实际使用中,你可能需要对重试机制进行更多控制,比如增加延迟(例如使用 QTimer)或根据不同的状态码决定是否重试。
  • 异常处理:如果发送请求过程中发生异常(如网络连接失败),你也可以在 finished 信号的槽中进行处理。

这就是如何实现当状态码不为 200 时重新发送请求。

http://www.lryc.cn/news/571199.html

相关文章:

  • idea中配置svn及提交提示“未检测到更改”提示
  • 条件查询详细说明
  • 为编写Python脚本实现H3C交换机自动化配置笔记一
  • Java编程之外观模式
  • JSON编辑器:三种模式的应用(三)
  • 重构气血经络的数学模型:气血经络级联控制系统核心方程
  • 第17天:数据库学习笔记1
  • MySQL 默认连接数
  • .sstop勒索加密数据库恢复---惜分飞
  • 从电商平台下载数据的项目经验分享 (part 1)
  • 前后端拦截器+MDC实现纯数字 traceId 全链路日志追踪(axios + Spring Boot 超详细实战)
  • DeepSeek 大型 MoE 模型大规模部署压测学习
  • FlinkCDC-Hudi数据实时入湖原理篇
  • JVM监控的挑战:Applications Manager如何提供帮助
  • Spring Boot集成Kafka全攻略:从基础配置到高级实践
  • 多模态大语言模型演进:从视觉理解到具身智能的技术突破
  • Linux运维新人自用笔记(部署 ​​LAMP:Linux + Apache + MySQL + PHP、部署discuz论坛)
  • 5.安装IK分词器
  • ELK在Java的使用
  • Selenium(选择元素,浏览器/元素操作,等待,页面交互)
  • Windows Python 环境管理终极对比:极简方案 VS 传统方案(仅需 2 个软件实现全流程自动化)
  • Selenium(多窗口,frame,验证码,截图,PO模式)
  • rockx读取单张图片并检测图片内人脸的矩形
  • vite的常用配置
  • 「动态规划::数位DP」统计数字递推 / LeetCode 3352|1012(C++)
  • 线程池(Thread Pool)详解
  • 基于Cesium移动的天空云
  • 【Docker基础】Docker核心概念:命名空间(Namespace)之IPC详解
  • 根据Python模块的完整路径import动态导入
  • 05_MinIO+Java SpringBoot 实现透传代理下载