Qt开源网络库[6]-超时功能

距离上一系列篇已经有半年没有更新了。本次介绍该网络库最近新增的超时功能(超时中断请求)。由于Qt的网络请求不能设置超时时间,故只能额外封装了。

接口

  • timeout通过msec参数设置超时时间;
  • msec <= 0则禁用超时功能;
  • msec > 0则使能超时功能,并将超时时间设置为msec毫秒。
    1
    2
    3
    4
    5
    /**
    * @brief msec <= 0, disable timeout
    * msec > 0, enable timeout
    */
    HttpRequest &timeout(const int &msec = -1);

实现

  • HttpResponseTimeout构造函数传递QNetworkReplytimeout参数用于超时中断设置;
  • QTimer::singleShot为单次定时器;
  • 当定时器超时后则会执行onTimeout函数;
  • onTimeout函数会执行QNetworkReplyabortdeleteLater来完成请求中断。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class HttpResponseTimeout : public QObject {
    Q_OBJECT
    public:
    HttpResponseTimeout(QNetworkReply *parent = NULL, const int timeout = -1) : QObject(parent) {
    if (timeout > 0)
    QTimer::singleShot(timeout, this, SLOT(onTimeout()));
    }

    private slots:
    void onTimeout() {
    QNetworkReply *reply = static_cast<QNetworkReply*>(parent());
    if (reply->isRunning()) {
    reply->abort();
    reply->deleteLater();
    }
    }
    };

示例

  • 使用示例设置30秒的超时时间,超时结束后将会强制中断当前请求。
    1
    2
    3
    4
    5
    6
    7
    static HttpService http;
    http.get("http://www.qtbig.com")
    .onResponse(this, SLOT(finish(QByteArray))) /* 接收数据 */
    .onResponse(this, SLOT(downloadProgress(qint64,qint64))) /* 接收进度 */
    .onError(this, SLOT(error(QNetworkReply::NetworkError, QNetworkReply*))) /* 错误处理 */
    .timeout(30*1000) /* 30s */
    .exec();