距离上一系列篇已经有半年没有更新了。本次介绍该网络库最近新增的超时功能(超时中断请求)。由于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
构造函数传递QNetworkReply
与timeout
参数用于超时中断设置;QTimer::singleShot
为单次定时器;- 当定时器超时后则会执行
onTimeout
函数; - 而
onTimeout
函数会执行QNetworkReply
的abort
和deleteLater
来完成请求中断。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class 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
7static 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();