QNetworkReply和QNetworkAccessManager在HTTP请求中的超时问题

14

当我进行 HTTP 请求时,如何设置超时时间?

我有以下代码:

{
    QNetworkRequest request;

    request.setUrl(QUrl("http://www.foo.com"));
    request.setRawHeader("User-Agent", USER_AGENT.toUtf8());
    request.setRawHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    request.setRawHeader("Accept",
        "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    request.setRawHeader("Accept-Language", "en-us,en;q=0.5");
    request.setRawHeader("Connection", "Keep-Alive");

    reply = m_networkManager->get(request);
    QEventLoop loop;
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
}

我应该在哪里,如何设置请求超时时间?


我正在使用m_networkManager->setTransferTimeout(30000)。 - Arun K
2个回答

29
QTimer timer;    
timer.setSingleShot(true);

QEventLoop loop;
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
timer.start(30000);   // 30 secs. timeout
loop.exec();

if(timer.isActive()) {
    timer.stop();
    if(m_reply->error() > 0) {
      ... // handle error
    }
    else {      
      int v = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

      if (v >= 200 && v < 300) {  // Success
        ...
      }
    }
} else {
   // timeout
   disconnect(reply, SIGNAL(finished()), &loop, SLOT(quit()));

   reply->abort();
}

3
请勿忘记删除回复。 - Dave
下载文件时,对于大文件,我们需要设置更长的超时时间吗?针对这种情况有什么解决方案? - kien bui
@kienbui 不是的。这些有单独的信号,例如 bytesAvailableuploadProgress - Zimano
1
我们可以在这里投票支持“添加内置的网络超时支持”:https://bugreports.qt.io/browse/QTBUG-3443 - kien bui
这是一个杰出的解决方案 @cyber_raj - CybeX

4

看这个:

https://doc.qt.io/qt-5/qnetworkrequest.html#setTransferTimeout

void QNetworkRequest::setTransferTimeout(int timeout = DefaultTransferTimeoutConstant) 以毫秒为单位设置传输超时时间。

如果在超时时间内没有传输任何字节,则传输中止。零表示不设置计时器。如果未提供参数,则超时时间为QNetworkRequest :: DefaultTransferTimeoutConstant。如果未调用此函数,则超时被禁用且值为零。

此函数在Qt 5.15中引入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接