QNetworkAccessManager无法获取任何HTML

时间:2015-04-02 01:34:36

标签: qt

我们使用QNetworkAccessManager来请求远程网址,但我们遇到了一个问题:它无法获取任何HTML,即使它可以获得响应体大小。

这是代码:

   manager=new QNetworkAccessManager(0);
    cookie = new QNetworkCookieJar(0);
    manager->setCookieJar(cookie);
    QString str_url="http://www.wangdaizhijia.com/daohang.html";
    QNetworkRequest request;
    request.setUrl(QUrl(str_url));
    request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    request.setRawHeader("Accept-Language", "zh-CN,zh;q=0.8");
    request.setRawHeader("Cache-Control", "no-cache");
    request.setRawHeader("Connection", "keep-alive");
    request.setRawHeader("DNT","1");
    request.setRawHeader("Pragma","no-cache");
    request.setRawHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36");
QNetworkReply *reply=manager->get(request);
    QEventLoop eventLoop;
    QTimer timer;
    QObject::connect(reply, SIGNAL(finished()),&eventLoop, SLOT(quit()));
    QObject::connect(&timer, SIGNAL(timeout()),&eventLoop, SLOT(quit()));
    timer.start(5*1000);
    eventLoop.exec();
    if(!timer.isActive())
    {
        timer.stop();
    }
    QByteArray temp=reply->readAll();
    qDebug()<<"size is"<<temp.size();
    qDebug()<<"html is"<<temp;

如果我们要求其他网址,例如http://www.google.com,它正在发挥作用。为什么呢?

2 个答案:

答案 0 :(得分:1)

我总是从连接到完成信号的插槽内读取QNetworkReply对象的内容。这是确保回复对象可以从中读取的方法。

我不确定为什么在这种情况下你需要事件循环。

尝试将已完成信号连接到函数并将此位移动到该函数:

QByteArray temp = reply - > readAll();
qDebug() << "size is" << temp.size();
qDebug() << "html is" << temp;

答案 1 :(得分:1)

首先,您的代码中存在错误:

if(!timer.isActive())
{
    timer.stop();
}

应该是

if(timer.isActive())
{
    timer.stop();
}

从您的代码中,我可以看到您正在等待使用QEventLoop的答案。 QTimer用于在远程服务器响应时间过长时停止循环。

您应检查QNetworkReply是否已完成,因此您的代码应如下所示:

eventLoop.exec();
if(timer.isActive())
{
    timer.stop();
}
if(!reply->isFinished())
{
    qDebug() << "Error request timed out";
    return;
}