QNetworkAccessManager 问题

Posted

技术标签:

【中文标题】QNetworkAccessManager 问题【英文标题】:QNetworkAccessManager problem 【发布时间】:2011-07-26 22:18:23 【问题描述】:

我正在尝试使用 QNetworkAccessManager 打开网页 - 对于某些页面它可以正常工作 - 而对于其他页面则不能。我尝试设置一个真正的浏览器用户代理,但它仍然不起作用,例如http://www.erepublik.com。代码如下:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
             this, SLOT(replyFinished(QNetworkReply*)));

QNetworkRequest *request = new QNetworkRequest(QUrl("http://www.erepublik.com"));

request->setRawHeader( "User-Agent", "Mozilla/5.0 (X11; U; Linux i686 (x86_64); "
                           "en-US; rv:1.9.0.1) Gecko/2008070206 Firefox/3.0.1" );
request->setRawHeader( "charset", "utf-8" );
request->setRawHeader( "Connection", "keep-alive" );

manager->get(*request);

...

void MainWindow::replyFinished(QNetworkReply *reply)

     QString data = reply->readAll();
     qDebug() << data;

数据如下:

<html><head><meta http-equiv="refresh" content="0;url=http://www.erepublik.com/en"/></head></html><html><head><meta http-equiv="refresh" content="0;url=http://www.erepublik.com/en"/></head></html>

现在,困扰我的是,这适用于像 http://www.hardwarebase.net 这样的网站(数据返回正常的 HTML 源),而它不适用于 eRepublik。

对于那些想知道我到底想做什么的人 - 我想从 eRepublik 首页获取国家的人口数量。

任何想法为什么会发生这种情况?提前致谢。

【问题讨论】:

【参考方案1】:

看起来您正确获取了数据,只是该特定 URL 只是将您转发到另一个 URL。请改用 http://www.erepublik.com/en(使用 /en)。

【讨论】:

谢谢你,成功了。因为你比 Goz 快,所以我选择了你的答案。 QNetworkAccessManager 可以自动处理这种重定向吗? 可以连接QNetworkAccessManager的metaDataChanged信号,检查状态码是否为HTTP重定向码【参考方案2】:

返回的 HTML 会将您重定向到 http://www.erepublik.com/en,因此您最好形成 QNetworkRequest 以直接访问该 URL。

【讨论】:

以上是关于QNetworkAccessManager 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 QNetworkAccessManager 通过 HTTPS 下载文件:如何进行身份验证?

错误:没有用于调用“QNetworkAccessManager::QNetworkAccessManager(Networking* const)”的匹配函数

QNetworkAccessManager 问题

使用 QNetworkAccessManager 请求

QNetworkAccessManager - 如何发送 MultiPart “PATCH” 请求

QNetworkAccessManager 和 XML 回复