Domanda

Sto cercando di fare un client di riposo molto semplice in Qt, ma sto ottenendo un "errore sconosciuto" nella mia risposta. Anche quando faccio una cattura di pacchetti, vedo 0 pacchetti vengono inviati al server.

Il mio codice è:

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

E il mio risultato è: errore sconosciuto.

La semplice applicazione viene compilata senza errori o avvisi.

Qualcuno può vedere qualsiasi problema?

La mia uscita prevista è "Hello Bob" ed è stata testata con successo con un client PHP usando Curl.

È stato utile?

Soluzione

Sembra che tu stia esagerare l'API QTNetwork. Hai almeno i seguenti problemi in corso:

    .
  • Si include l'intero modulo Qtnetwork rispetto alle classi necessarie.

  • Si chiama Errorstrin () prima che il segnale Errore () sia emesso. Questo non è buono, e ciò che vedi è previsto perché lo stato predefinito è un distorsionirror come da documentazione.

  • Non si collega al segnale finito dell'API ASYNC. Il QNETworkReply restituito è solo un puntatore che è possibile utilizzare in seguito per accedere ai membri, ma non contiene ancora la risposta che a quel punto.

  • Si sta istanziando una QCoReapplication, ma non lo usa effettivamente per eseguire un ciclo di eventi che è necessario per l'operazione ASYNC per ottenere la risposta. Potresti sempre bloccare, ma non è realmente raccomandato la maggior parte del tempo.

  • Si utilizza un puntatore per QNETworkAccessManager qui inutilmente.

  • Si utilizza le lettere maiuscole macro per un nome di variabile regolare.

Potresti scrivere un codice come sotto. Sarebbe più semplice usare lambda con C ++ 11, ma suppongo che tu abbia bisogno di farlo funzionare con pre-compilatori.

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
.

Build ed Esegui

qmake && make
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top