QT NetworkAccessManager Erro Desconhecido
-
21-12-2019 - |
Pergunta
Eu estou tentando fazer um simples RESTO do cliente em QT no entanto, eu estou ficando um "erro desconhecido" na minha Resposta.Também quando eu faço uma captura de pacotes, eu vejo 0 pacotes de ser enviado para o servidor.
Meu código é:
#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 meu resultado:erro desconhecido.
O simples requerimento não compilar sem erros ou avisos.
alguém pode ver que todos os problemas?
A minha saída esperada é "Olá BOB" e foi testado com sucesso com o PHP cliente usando Curl.
Solução
Você parece estar usando mal o QtNetwork API.Você tem pelo menos as seguintes questões em andamento:
Você está incluindo toda a QtNetwork módulo de oposição para as classes necessárias.
Você chamar o errorStrin() antes do erro() é emitido um sinal.Isso não é bom, e o que você vê é esperado porque o estado padrão é UnknownError como por documentação.
Você não ligar para o terminar sinal da API assíncrono.A devolvidos QNetworkReply é apenas um ponteiro que você pode usar mais tarde para o acesso de membros, mas ainda não contém a resposta que naquele ponto.
Você está instanciando um QCoreApplication, mas, na verdade, não utilizando-o para a execução de um ciclo de eventos que é necessário para a operação assíncrona para obter a resposta.Você pode bloquear sempre, muito, mas que realmente não é recomendada a maior parte do tempo.
Você está usando um ponteiro para o QNetworkAccessManager aqui desnecessariamente.
Você está usando a macro ish letras maiúsculas regular, em nome de variável.
Você pode escrever código como o abaixo.Seria mais simples usar lambda com o C++11, mas eu estou supondo que você precisa para começar a trabalhar com o pré-tais compiladores.
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();
}
principal.pro
TEMPLATE = app
TARGET = main
QT = core network
SOURCES += main.cpp
Criar e Executar
qmake && make