【问题标题】:Qt QNetworkReply is always emptyQt QNetworkReply 始终为空
【发布时间】: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.
}

代码编译并运行良好。它只是行不通。

【问题讨论】:

    标签: c++ qt


    【解决方案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)
    猜你喜欢
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多