Мой вызов qhttp get() не работает в Windows, но работает в Linux

StackOverflow https://stackoverflow.com/questions/803088

  •  03-07-2019
  •  | 
  •  

Вопрос

Я написал программу, которая использует qhttp для получения веб-страницы.Это отлично работает в Linux, но не работает в моей системе Windows (Vista).Похоже, что сигнал выполнения qhttp никогда не получен.

Соответствующий код:

    Window::Window()
{
    http = new QHttp(this);
    connect(http, SIGNAL(done(bool)), this, SLOT(httpDone(bool)));
url = new QUrl("http://something.com/status.xml");
http->setHost(url->host(), url->port() != -1 ? url->port() : 80);
    if (!url->userName().isEmpty()) http->setUser(url->userName(), url->password());
}

void Window::retrievePage()
{ 
byteArray = new QByteArray;
result = new QBuffer(byteArray);
result->open(QIODevice::WriteOnly);

    httpRequestAborted = false;
    httpGetId = http->get(url->path(), result);
 }

 void Window::httpDone(bool error)
 {
     //Never gets here!
 }

Любая помощь будет принята.

Мэтт

Это было полезно?

Решение

Этого вообще не должно происходить, т.е.QHttp надежно работает как в Windows, так и в Unix.

Мой совет: проверьте, дает ли подача правильный ответ.Это можно сделать, например.проверив, что передача данных в порядке.Вы можете отслеживать статус по сигналу QHttp, например. данныеЧтениеПрогресс, запросНачало, запросЗавершен, и другие связанные сигналы.

С другой стороны, вместо использования старого QHttp, почему бы не использовать рекомендуемый QNetworkAccessManager вместо?Чтобы быстро намочить ноги, посмотрите пример, который я опубликовал в Qt Labs некоторое время назад: просмотрщик изображений с поддержкой удаленного перетаскивания URL-адресов.Он использует сказанное QNetworkAccessManager чтобы получить изображение из переброшенного URL-адреса.Проверить исходный код, это всего 150 строк.

Другие советы

Переписано, как предложила Ария, для использования QNetworkAccessManager и просмотра этот пример

Теперь это работает в Windows и Linux.

Window::Window()
{
   connect(&manager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(retrieveData(QNetworkReply*)));
}

void Window::retrieveMessage()
{
    manager.get(QNetworkRequest(QUrl("http://...")));
}

void Window::retrieveData(QNetworkReply *reply)
{
    QVariant statusCodeV = 
    reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

    // "200 OK" received?
    if (statusCodeV.toInt()==200)
    {
        QByteArray bytes = reply->readAll();  // bytes
    }

    reply->deleteLater();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top