在使用http时经常要面临请求超时后要怎么处理的问题,但是
QNetworkAccessManager
本身又没有设置超时的接口,所以需要自己实现相关功能,思路其实也很简单,就是将请求的回调做定时器判断,如果到时间后还在运行中那么结束请求。
这里再介绍一个问题,QNetworkAccessManager
有retry
重试机制,这个问题需要注意,暂时没找到接口可以阻断重试,能想到的就是通过 超时解决。
设置超时
// .h部分
#ifndef QREPLYTIMEOUT_H
#define QREPLYTIMEOUT_H
#include <QObject>
#include <QTimer>
#include <QNetworkReply>
class QReplyTimeout : public QObject
{
Q_OBJECT
public:
explicit QReplyTimeout(QNetworkReply *parent, int timeout);
signals:
void sigTimeout(QNetworkReply *reply);
private slots:
void slotTimeoutWork();
private:
QTimer* m_pTimeoutTimer;
};
#endif // QREPLYTIMEOUT_H
// .cpp部分
#include "qreplytimeout.h"
QReplyTimeout::QReplyTimeout(QNetworkReply *parent, int timeout)
: QObject(parent)
{
if(parent && parent->isRunning()){
m_pTimeoutTimer = new QTimer;
m_pTimeoutTimer->setSingleShot(true);
connect(m_pTimeoutTimer, &QTimer::timeout,
this, &QReplyTimeout::slotTimeoutWork, Qt::UniqueConnection);
m_pTimeoutTimer->start(timeout);
}
}
void QReplyTimeout::slotTimeoutWork()
{
QNetworkReply *reply = static_cast<QNetworkReply*>(parent());
if(nullptr != reply && reply->isRunning())
{
emit sigTimeout(reply);
}
}
使用方法
// 做一个方法,使用时直接调用方法即可
void **::timeoutRepley(QNetworkReply *reply)
{
QReplyTimeout *pReplyTimeout = new QReplyTimeout(reply, 5 * 1000);
connect(pReplyTimeout, &QReplyTimeout::sigTimeout, this, [&](QNetworkReply *_reply){
_reply->abort();
_reply->deleteLater();
});
}
例如:
QNetworkReply *reply = m_AccessManager->get(m_Request);
timeoutRepley(reply);