Создание HTTP GET под Qt - PullRequest
       19

Создание HTTP GET под Qt

6 голосов
/ 28 августа 2011

У меня какая-то проблема с n00b, я не могу сделать HTTP-запросы GET из моего Qt-кода ...

Вот код, который должен работать:

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

Но проблема в том, что это просто не работает: в requestReceived(QNetworkReply* reply), replyText кажется пустым, reply->error() возвращает 0 и reply->errorString() возвращает "Неизвестная ошибка". Я действительно не знаю, что делать сейчас ...

Есть идеи?

Ответы [ 2 ]

10 голосов
/ 28 августа 2011

Очевидно, что существует перенаправление, которое не считается ошибкой.
Вы должны выполнить новый запрос с URL-адресом перенаправления, указанным в атрибутах ответа, пока не получите реальную страницу:

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

Вы также должны записать, куда вы перенаправлены, или посчитать количество перенаправлений, чтобы избежать бесконечных циклов.

0 голосов
/ 28 августа 2011

Если reply->error() = 0, это означает, что запрос был успешным. На самом деле ваш код кажется мне правильным, и единственное, что я бы сделал по-другому, - это прочитал данные. Попробуйте с этим:

QByteArray rawData = reply->readAll();
QString textData(rawData);
qDebug() << textData;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...