Вопрос

Я пытаюсь сделать очень простой клиент для отдыха в Qt, однако я получаю «неизвестную ошибку» в моем ответе. Кроме того, когда я делаю захват пакета, я вижу 0 пакетов, отправляемых на сервер.

Мой код:

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

и мой результат: неизвестная ошибка.

Простое приложение делает компиляцию без ошибок или предупреждений.

Может кто-нибудь увидеть какие-либо проблемы?

Мой ожидаемый выход - «Hello Bob» и был успешно протестирован с помощью клиента PHP, используя CURL.

Это было полезно?

Решение

Вы, кажется, не злоупотребляют API Qtnetwork. У вас есть по крайней мере следующие вопросы:

    .
  • Вы включаете весь модуль QTnetwork, в отличие от необходимых классов.

  • Вы вызываете Errorstrin () до того, как сигнал ошибки () испускается. Это не хорошо, и то, что вы видите, ожидается, потому что состояние по умолчанию - неизвестен, согласно документации.

  • Вы не подключаетесь к готовому сигналу ASYNC API. Возвращенный QNetWorkreply - это просто указатель, который вы можете использовать позже, чтобы получить доступ к пользователям, но он еще не содержит ответа, который в этой точке.

  • Вы создаете QCOReApplication, но не на самом деле, используя его для запуска петли событий, необходимой для асинхронизации для получения ответа. Вы также могли бы всегда блокировать, но это не совсем рекомендуется большую часть времени.

  • Вы используете указатель для qnetworkaccessmanager здесь, ненужно.

  • Вы используете макрозащитные заглавные буквы для регулярного имени переменной.

Вы можете написать какой-нибудь код, как ниже. Было бы проще использовать лямбда с C ++ 11, но я предполагаю, что вам нужно получить его работать с предварительно такими компиляторами.

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
.

Создание и запуск

qmake && make
.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top