2011-08-28 20 views
6

tengo clase de problema n00b, me parece que no puede hacer peticiones HTTP GET desde mi código de Qt ...HTTP GET bajo Qt

Aquí está el código supone que funciona:

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); 
} 

Pero el problema es que esto simplemente no funciona: En requestReceived(QNetworkReply* reply), replyText parece vacío, reply->error() vuelve 0 y reply->errorString() devuelve "error desconocido". Realmente no sé qué hacer en este momento ...

¿Alguna idea?

Respuesta

9

Obviamente, hay una redirección, que no se considera un error.
Debe ejecutar una nueva solicitud con la dirección URL de redirección proporcionada en la respuesta atributos hasta que llegue la verdadera página:

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(); 
} 

También debe registrar en donde se le redirige o contar el número de cambios de dirección, para evitar que nunca termina bucles.

+1

¡Muchas gracias! ¡Tu solución funciona como un encanto! Nunca lo hubiera tenido difícil ... –

+0

@alexisdm Hola, estaba teniendo un problema similar a esto, excepto que mi URL que se redirige también tiene datos de publicación, ¿hay algo similar a este código que funcione para eso? – thnkwthprtls

0

Si reply->error() = 0, significa que la solicitud fue exitosa. De hecho, su código me parece correcto, y lo único que haría de manera diferente es leer los datos. Pruebe con esto:

QByteArray rawData = reply->readAll(); 
QString textData(rawData); 
qDebug() << textData;