Pregunta

Estoy tratando de hacer un cliente de descanso muy simple en QT, sin embargo, estoy recibiendo un "error desconocido" en mi respuesta. También cuando hago una captura de paquetes, veo 0 paquetes que se envían al servidor.

Mi código es:

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

y mi resultado es: error desconocido.

La aplicación simple compila sin errores o advertencias.

¿Alguien puede ver algún problema?

Mi salida esperada es "Hola Bob" y se probó con éxito con un cliente PHP utilizando CURL.

¿Fue útil?

Solución

Parece que estás haciendo mal uso de la API de QtNetwork. Usted tiene al menos los siguientes problemas en curso:

  • Usted incluye todo el módulo QTNetwork en lugar de las clases necesarias.

  • Llame al error de error () antes de que se emita la señal de error (). Esto no es bueno, y lo que se ve se espera, ya que el estado predeterminado es el estado desconocido según la documentación.

  • No se está conectando a la señal terminada de la API de ASYNC. El QNETWorkReply devuelto es solo un puntero que puede usar más tarde para acceder a los miembros, pero aún no contiene la respuesta que en ese punto.

  • Usted está instantáneizando una qcorapplication, pero en realidad no lo usa para ejecutar un bucle de eventos que es necesario para la operación de ASYNC para obtener la respuesta. Siempre se puede bloquear, también, pero eso no se recomienda realmente la mayor parte del tiempo.

  • Usted está utilizando un puntero para el QNETWorkAccessManager aquí innecesariamente.

  • Usted está utilizando letras mayúsculas macroeléctricas para un nombre de variable regular.

Podrías escribir un código como a continuación. Sería más sencillo usar Lambda con C ++ 11, pero supongo que necesita trabajar con los compiladores pre-tales.

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

construir y ejecutar

qmake && make
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top