Qt https/http超时设置

在使用http时经常要面临请求超时后要怎么处理的问题,但是 QNetworkAccessManager 本身又没有设置超时的接口,所以需要自己实现相关功能,思路其实也很简单,就是将请求的回调做定时器判断,如果到时间后还在运行中那么结束请求。
这里再介绍一个问题,QNetworkAccessManagerretry重试机制,这个问题需要注意,暂时没找到接口可以阻断重试,能想到的就是通过 超时解决。

设置超时

// .h部分
#ifndef QREPLYTIMEOUT_H
#define QREPLYTIMEOUT_H

#include 
#include 
#include 

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(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);

你可能感兴趣的:(网络编程,QT,qt,http,开发语言)