2013-07-16 23 views
7

我想查看GET请求的结果。根据我的理解,这段代码应该这样做。我究竟做错了什么?Qt QNetworkReply始终为空

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. 
} 

该代码编译并运行良好。它只是不起作用。

回答

4

尝试修改您的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状态码,当我回来,因为我不想要执行的方法的其余部分。

我希望这有助于!

+0

谢谢。 qDebug()给出了一个200的代码,所以它的工作原理。 我现在如何访问页面的内容?那么QString xml(str)能做什么 ? – Dirk

+1

很高兴听到它的作品!我从我的另一个项目中复制了上述代码,并忘记删除'QString xml(str)'行。感谢您的关注。 'QString str'应该让你访问页面内容。让我知道如果它不。 –

+1

另请参阅QNetworkRequest :: FollowRedirectsAttribute(http://doc.qt.io/qt-5/qnetworkrequest.html),如果您使用Qt 5.6 < – ismailsunni