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 Jambi:访问 QNetworkReply 的内容

QnetworkReply 错误 - Symbian Qt

Qt 使用 QNetworkReply 获取外部 IP 地址

Qt QNetworkAccessManager 和多个 QNetworkReply

Visual Basic 服务器和 Qt 客户端(QNetworkReply 完成较新的发布)

qt QNetworkReply 从互联网广播下载媒体流