距离上一系列篇已经有半年没有更新了。本次介绍该网络库最近新增的超时功能(超时中断请求)。由于Qt的网络请求不能设置超时时间,故只能额外封装了。
msec<=0
则禁用超时功能;msec>0
则使能超时功能,并将超时时间设置为 msec
毫秒。/**
* @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
来完成请求中断。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();
}
}
};
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();