当前位置: 首页 > 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 时重新发送请求。

相关文章:

  • 数据库系统概论(十九)详细讲解关系查询处理与查询优化
  • 设计模式-依赖倒置原则(Dependency Inversion Principle, DIP)
  • Spring Boot(九十一):Spring Boot实现防盗链功能
  • WPS 和 office (word/excel/ppt) 找到模板所在位置以及更改模板的方式(公文写作格式要求、字体安装、模板下载)
  • Maven高级学习笔记
  • 常见哈希格式类型及其在CTF与渗透测试中的爆破与伪造策略(PBKDF2、bcrypt...)
  • Spring Boot分布式锁深度优化:彻底解决达梦数据库高并发死锁问题
  • 【C++11】智能指针——unique_ptr, shared_ptr和weak_ptr
  • DBeaver数据库管理工具的简介、下载安装与优化配置
  • 【Dify精讲】第10章:会话管理与上下文保持【知识卡片】
  • Nginx入门篇
  • 【计算机网络】:get与post
  • 基于协同过滤的新高考志愿个性化智能推荐系统前后端讲解
  • 座舱监控系统(In-Cabin Monitoring System,IMS)相关知识
  • Gartner发布终端安全项目路线图:保护终端免受复杂网络攻击
  • 前端项目如何部署为https
  • 每天一个前端小知识 Day 3 - JavaScript 的作用域与闭包
  • C++指针的使用
  • 计算机网络 期末实训 eNSP 校园网
  • AI 在智慧农业领域的 10 大应用:从作物监测到精准营销
  • 微信视频网站怎么做/宁波seo网站排名
  • 做相册的网站(网易/百度seo是什么意思
  • 长辛店镇网站建设/2022年适合小学生的新闻
  • 赣州网站建设优化服务/简单的个人主页网站制作
  • 网站开发员/如何网络推广
  • 福建网站备案/代发百度关键词排名