在 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;
}
代码说明
-
最大重试次数 (
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 时重新发送请求。