在 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 时重新发送请求。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Respect@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值