Qt networkaccessmanager errore sconosciuto
-
21-12-2019 - |
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.
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
.