2013-07-16 8 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スロットを変更してみてください。あなたが302を取得している場合は

qDebug() << QVariant(statusCode).toString(); 

QByteArray bytes = reply->readAll(); 
QString str = QString::fromUtf8(bytes.data(), bytes.size()); 
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 

あなたは、あなたは200応答を取得しているかどうかを確認するためにからstatusCodeを印刷することができますレスポンス、ステータスリダイレクトを取得しています。あなたはこのようにそれを処理する必要があります。

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

Qt 5.6を使用している場合は、QNetworkRequest :: FollowRedirectsAttribute(http://doc.qt.io/qt-5/qnetworkrequest.html)も参照してください< – ismailsunni

関連する問題