在 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;
}
代码说明
-
最大重试次数 (
MAX_RETRY_COUNT
):这里定义了最大重试次数(例如 3 次)。你可以根据需要调整这个值。 -
重试逻辑:在
finished
信号的槽函数内:- 检查 HTTP 状态码。
- 如果状态码不是 200 且
retryCount
小于最大重试次数,则增加重试次数,并重新调用sendPostRequest()
函数来发送请求。 - 如果状态码为 200,则表示请求成功,打印成功信息。
- 如果超过最大重试次数仍然没有成功,则打印失败信息。
-
递归发送请求:在状态码不为 200 时,我们通过递归调用
sendPostRequest()
来重新发送请求。递归时会增加retryCount
,直到达到最大重试次数。 -
资源清理:每次请求完成后都会调用
pReply->deleteLater()
来确保响应对象被正确销毁。
使用方式
假设你需要发送一个 POST 请求,只需调用 sendPostRequest()
函数:
QUrl url("http://your.api.endpoint");
QByteArray data = "your request data";
sendPostRequest(url, data);
其他优化
- 防止无限递归:在实际使用中,你可能需要对重试机制进行更多控制,比如增加延迟(例如使用
QTimer
)或根据不同的状态码决定是否重试。 - 异常处理:如果发送请求过程中发生异常(如网络连接失败),你也可以在
finished
信号的槽中进行处理。
这就是如何实现当状态码不为 200 时重新发送请求。