2011-08-28 24 views
6

tôi có loại của một vấn đề n00b, tôi dường như không thể làm cho HTTP GET yêu cầu từ Mã Qt của tôi ...Làm một HTTP GET dưới Qt

Đây là mã vụ phải làm việc:

void MainWindow::requestShowPage(){ 
    QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestReceived(QNetworkReply*))); 
manager->get(QNetworkRequest(QUrl("http://google.com"))); 
} 

void MainWindow::requestReceived(QNetworkReply* reply){ 
    QString replyText; 
    replyText.fromAscii(reply->readAll()); 

    ui->txt_debug->appendPlainText(replyText); 
} 

Nhưng vấn đề là điều này không hoạt động: Trong requestReceived(QNetworkReply* reply), replyText có vẻ trống, reply->error() trả về 0reply->errorString() trả về "Lỗi không xác định". Tôi thực sự không biết phải làm gì bây giờ ...

Bất kỳ ý tưởng nào?

Trả lời

9

Rõ ràng là chuyển hướng, không được coi là lỗi.
Bạn nên chạy một yêu cầu mới với url chuyển hướng cung cấp trong bài trả lời thuộc tính cho đến khi bạn có được những trang thực sự:

void MainWindow::requestReceived(QNetworkReply *reply) 
{ 
    reply->deleteLater(); 

    if(reply->error() == QNetworkReply::NoError) { 
     // Get the http status code 
     int v = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
     if (v >= 200 && v < 300) // Success 
     { 
      // Here we got the final reply 
      QString replyText = reply->readAll(); 
      ui->txt_debug->appendPlainText(replyText); 
     } 
     else if (v >= 300 && v < 400) // Redirection 
     { 
      // Get the redirection url 
      QUrl newUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); 
      // Because the redirection url can be relative, 
      // we have to use the previous one to resolve it 
      newUrl = reply->url().resolved(newUrl); 

      QNetworkAccessManager *manager = reply->manager(); 
      QNetworkRequest redirection(newUrl); 
      QNetworkReply *newReply = manager->get(redirection); 

      return; // to keep the manager for the next request 
     } 
    } 
    else 
    { 
     // Error 
     ui->txt_debug->appendPlainText(reply->errorString()); 
    } 

    reply->manager()->deleteLater(); 
} 

Bạn cũng nên ghi lại nơi bạn đang chuyển hướng hoặc đếm số chuyển hướng, để tránh không bao giờ kết thúc vòng lặp.

+1

Cảm ơn bạn rất nhiều! Giải pháp của bạn hoạt động như một sự quyến rũ! Tôi đã không bao giờ khó khăn của nó ... –

+0

@alexisdm Hi, tôi đã có một vấn đề tương tự này, ngoại trừ URL của tôi được chuyển hướng cũng có dữ liệu đăng bài, là có bất cứ điều gì tương tự như mã này sẽ làm việc cho điều đó? – thnkwthprtls

0

Nếu reply->error() = 0, điều đó có nghĩa là yêu cầu đã thành công. Trong thực tế, mã của bạn có vẻ phù hợp với tôi, và điều duy nhất tôi sẽ làm khác đi là đọc dữ liệu. Hãy thử với điều này:

QByteArray rawData = reply->readAll(); 
QString textData(rawData); 
qDebug() << textData; 
Các vấn đề liên quan