Qt QNetworkReply 始终为空
Posted
技术标签:
【中文标题】Qt QNetworkReply 始终为空【英文标题】:Qt QNetworkReply is always empty 【发布时间】:2013-07-16 20:41:02 【问题描述】:我想查看 GET 请求的结果。据我了解,这段代码应该可以做到。我做错了什么?
void getDoc::on_pushButton_2_clicked()
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://www.google.com")));
void getDoc::replyFinished(QNetworkReply *reply)
qDebug() << reply->error(); //prints 0. So it worked. Yay!
QByteArray data=reply->readAll();
qDebug() << data; // This is blank / empty
QString str(data);
qDebug() << "Contents of the reply: ";
qDebug() << str; //this is blank or does not print.
代码编译并运行良好。它只是行不通。
【问题讨论】:
【参考方案1】:尝试将您的 replyFinished 槽修改为如下所示:
QByteArray bytes = reply->readAll();
QString str = QString::fromUtf8(bytes.data(), bytes.size());
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
然后您可以打印 statusCode 以查看是否收到 200 响应:
qDebug() << QVariant(statusCode).toString();
如果您收到 302 响应,您将收到状态重定向。你需要像这样处理它:
if(statusCode == 302)
QUrl newUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
qDebug() << "redirected from " + replyUrl + " to " + newUrl.toString();
QNetworkRequest newRequest(newUrl);
manager->get(newRequest);
return;
我在遇到状态码 302 时返回,因为我不希望执行该方法的其余部分。
我希望这会有所帮助!
【讨论】:
谢谢。 qDebug() 给出的代码是 200,所以它可以工作。我现在如何访问页面的内容? QString xml(str) 有什么作用? 很高兴听到它有效!我从我的另一个项目中复制了上面的代码,忘记删除QString xml(str)
行。感谢您提请我注意。 QString str
应该允许您访问页面内容。如果没有,请告诉我。
如果您使用 Qt 5.6,另请参阅 QNetworkRequest::FollowRedirectsAttribute (doc.qt.io/qt-5/qnetworkrequest.html)
以上是关于Qt QNetworkReply 始终为空的主要内容,如果未能解决你的问题,请参考以下文章
Qt 使用 QNetworkReply 获取外部 IP 地址
Qt QNetworkAccessManager 和多个 QNetworkReply