2013-07-16 22 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