У меня проблема с 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 ответа
Очевидно, что существует перенаправление, которое не считается ошибкой.
Вы должны запускать новый запрос с 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();
}
Вы также должны записать, куда вы перенаправлены, или подсчитать количество перенаправлений, чтобы избежать бесконечных циклов.
Если reply->error()
= 0, это означает, что запрос был успешным. На самом деле, ваш код мне кажется правильным, и единственное, что я бы сделал иначе, - это прочитал данные. Попробуйте с этим:
QByteArray rawData = reply->readAll();
QString textData(rawData);
qDebug() << textData;
Похожие вопросы
Связанные вопросы
Новые вопросы
qt
Qt - это кроссплатформенная среда разработки приложений, широко используемая для разработки прикладного программного обеспечения, которая может работать на различных программных и аппаратных платформах с минимальными изменениями в базовом коде или без таковых, при этом обладая мощью и скоростью собственных приложений. Qt доступен как с коммерческими, так и с открытыми лицензиями.