2011-08-28 13 views
6

Ho una specie di problema n00b, non riesco a fare richieste HTTP GET dal mio codice Qt ...Fare una HTTP GET in Qt

Ecco il codice dovrebbe funzionare:

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

Ma il problema è che questo non funziona: In requestReceived(QNetworkReply* reply), replyText sembra vuota, reply->error() rendimenti 0 e reply->errorString() restituisce "errore sconosciuto". Non so davvero cosa fare adesso ...

Qualche idea?

risposta

9

C'è ovviamente un reindirizzamento, che non è considerato come un errore.
Si consiglia di eseguire una nuova richiesta con l'URL di reindirizzamento fornito nella risposta attributi fino ad ottenere la pagina vera e propria:

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

Si dovrebbe anche registrare in cui si viene reindirizzati o contare il numero di reindirizzamenti, per evitare di non finisce mai loop.

+1

Grazie mille! La tua soluzione funziona come un fascino! Non avrei mai avuto problemi ... –

+0

@alexisdm Ciao, stavo avendo un problema simile a questo, tranne che il mio URL che viene reindirizzato ha anche dati di post, c'è qualcosa di simile a questo codice che potrebbe funzionare per quello? – thnkwthprtls

0

Se reply->error() = 0, significa che la richiesta è stata eseguita correttamente. In effetti, il tuo codice mi sembra giusto e l'unica cosa che farei diversamente è leggere i dati. Prova con questo:

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