我们使用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,它正在发挥作用。为什么呢?
答案 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;
}