Question

J'essaie de faire un très simple client de repos dans qt, mais je reçois une "erreur inconnue" dans ma réponse. De plus, lorsque je fais une capture de paquets, je vois 0 paquets d'être envoyé sur le serveur.

Mon code est:

#include <QCoreApplication>
#include <QtNetwork>
#include <QDebug>

int main(int argc, char *argv[])
{
 QCoreApplication a(argc, argv);
 QNetworkAccessManager *NETWORK = new QNetworkAccessManager();
 NETWORK->setNetworkAccessible(QNetworkAccessManager::Accessible);
 QNetworkRequest REQUEST;
 REQUEST.setUrl(QUrl("http://test.com/test/rest/BOB"));
 QNetworkReply *REPLY = NETWORK->get(REQUEST);
 qDebug() << REPLY->errorString();
 return 0;
 }

et mon résultat est: erreur inconnue.

La simple application compile sans erreurs ni avertissements.

Quelqu'un peut-il voir des problèmes?

Ma sortie attendue est "Hello Bob" et a été testé avec succès avec un client PHP en utilisant CURL.

Était-ce utile?

La solution

Vous semblez avoir abusé de l'API Qtnetwork. Vous avez au moins les problèmes suivants en cours:

  • Vous incluez le module Qtnetwork entier par opposition aux classes nécessaires.

  • Vous appelez le signal ERRORSTRIN () avant que le signal d'erreur () est émis. Ce n'est pas bon et ce que vous voyez est attendu parce que l'état par défaut est inconnu pour la documentation.

  • Vous ne vous connectez pas au signal fini de l'API ASYNC. Le QetworkReweweworky retourné n'est qu'un pointeur que vous pouvez utiliser ultérieurement pour accéder aux membres, mais il ne contient pas encore la réponse qu'à ce moment-là.

  • Vous instanciez une liste QCoreApplication, mais n'utilisez pas réellement à exécuter une boucle d'événement nécessaire à l'opération ASYNC pour obtenir la réponse. Vous pouvez toujours bloquer, mais cela n'est pas vraiment recommandé la plupart du temps.

  • Vous utilisez un pointeur pour le qnetworkAccessManager ici inutilement.

  • Vous utilisez des lettres majuscules macro'âmes pour un nom de variable régulier.

Vous pouvez écrire du code comme ci-dessous. Il serait plus simple d'utiliser Lambda avec C ++ 11, mais je suppose que vous devez le faire fonctionner avec des compilateurs pré-tels.

main.cpp

#include <QNetworkReply>
#include <QNetworkAccessManager>
#include <QNetworkRequest>

#include <QCoreApplication>
#include <QDebug>
#include <QUrl>

class Download : public QObject
{
    Q_OBJECT
    public:
        explicit Download(QObject *parent = 0) : QObject (parent) {}
        ~Download() {}

    public slots:
        // void handleFinished() {}
        void handleFinished(QNetworkReply* networkReply) { qDebug() << "Reply:" << networkReply->readAll(); QCoreApplication::quit(); }
        void handleError(QNetworkReply::NetworkError code) { qDebug() << "Error:" << code; QCoreApplication::quit(); }
};

#include "main.moc"

int main(int argc, char **argv)
{
     QCoreApplication a(argc, argv);

     QNetworkAccessManager networkAccessManager;
     networkAccessManager.setNetworkAccessible(QNetworkAccessManager::Accessible);

     QNetworkRequest networkRequest;
     networkRequest.setUrl(QUrl("http://test.com/test/rest/BOB"));

     Download download;

     // QObject::connect(&networkRequest, SIGNAL(finished()), &download, SLOT(handleFinished()));
     QObject::connect(&networkAccessManager, SIGNAL(finished(QNetworkReply*)), &download, SLOT(handleFinished(QNetworkReply*)));

     // QObject::connect(&networkRequest, SIGNAL(error(QNetworkReply::NetworkError)), &download, SLOT(handleError(QNetworkReply::NetworkError)));

     networkAccessManager.get(networkRequest);

     return a.exec();
}

Main.Pro

TEMPLATE = app
TARGET = main
QT = core network
SOURCES += main.cpp

Construire et exécuter

qmake && make
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top