http请求中的QNetworkReply和QNetworkAccessManager超时

Posted

技术标签:

【中文标题】http请求中的QNetworkReply和QNetworkAccessManager超时【英文标题】:QNetworkReply and QNetworkAccessManager timeout in http request 【发布时间】:2012-10-23 20:03:42 【问题描述】:

当我发出一个 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) 【参考方案1】:
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();

【讨论】:

别忘了删除回复。 下载文件过程中,大文件需要更大的超时时间吗?这种情况的解决方案? @kienbui 没有。对此有单独的信号,例如bytesAvailableuploadProgress 我们可以在这里投票“添加对网络超时的内置支持”:bugreports.qt.io/browse/QTBUG-3443 这是一个绝妙的解决方案@cyber_raj【参考方案2】:

看看这个:

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

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

如果在超时之前没有传输任何字节,则传输被中止 过期。零表示没有设置定时器。如果没有提供参数,则 超时是 QNetworkRequest::DefaultTransferTimeoutConstant。如果这 函数未调用,超时被禁用并具有值 零。

这个函数是在 Qt 5.15 中引入的。

【讨论】:

以上是关于http请求中的QNetworkReply和QNetworkAccessManager超时的主要内容,如果未能解决你的问题,请参考以下文章

QNetworkReply 未被删除

Qt - 发出请求后QNetworkReply为空[重复]

QNetworkReply 不会在 HTML 注释中隐藏 JavaScript

使用受密码保护的代理服务器请求 https 时,来自 QNetworkAccessManager::get 的 QNetworkReply::UnknownNetworkError

QNetworkReply - 建立连接,写入第一个字节等

QNetworkReply 等待完成