Mon appel à qhttp get () ne fonctionne pas sous Windows mais fonctionne sous Linux

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

  •  03-07-2019
  •  | 
  •  

Question

J'ai écrit un programme qui utilise qhttp pour obtenir une page Web. Cela fonctionne correctement sous Linux, mais ne fonctionne pas sous Windows (Vista). Il semble que le signal qhttp done n’a jamais été reçu.

Le code approprié est:

    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!
 }

Toute aide serait appréciée.

Matt

Était-ce utile?

La solution

Cela ne devrait pas arriver du tout, c'est-à-dire que QHttp fonctionne de manière fiable à la fois sous Windows et sous Unix.

Mon conseil est de vérifier si le serveur donne une réponse appropriée. Cela peut être fait par exemple en vérifiant que le transfert de données est correct. Vous pouvez suivre l'état à partir du signal de QHttp, par exemple. dataReadProgress , requestStarted , requestFinished et d'autres signaux associés.

D'autre part, au lieu d'utiliser l'ancien QHttp, pourquoi ne pas utiliser le QNetworkAccessManager à la place? Pour vous familiariser rapidement, consultez un exemple que j'ai posté à Qt Labs il y a quelque temps: visionneuse d'images avec prise en charge du glisser-déposer des URL distantes . Il utilise QNetworkAccessManager pour récupérer l'image à partir de l'URL déposée. Consultez le code source , ce ne sont que 150 lignes.

Autres conseils

Réécrit comme suggéré par Ariya l’utilisation de QNetworkAccessManager et en regardant cet exemple

Ceci fonctionne maintenant sous Windows et 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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top