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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top