QT NetworkAccessManager未知错误

时间:2014-01-09 00:07:16

标签: c++ qt qnetworkaccessmanager qtnetwork qt-signals

我正在尝试在QT中做一个非常简单的REST客户端,但是我在回复中遇到了“未知错误”。 此外,当我进行数据包捕获时,我看到有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”,并使用Curl成功通过PHP客户端测试。

1 个答案:

答案 0 :(得分:3)

您似乎在滥用QtNetwork API。您至少还有以下问题:

  • 您包括整个QtNetwork模块而不是必要的类。

  • 在发出error()信号之前调用errorStrin()。这不好,你看到的是预期的,因为根据文档默认状态是UnknownError。

  • 您没有连接到异步API的完成信号。返回的QNetworkReply只是一个指针,您稍后可以使用它来访问成员,但它还没有包含此时的回复。

  • 您正在实例化QCoreApplication,但实际上没有使用它来运行事件循环,这是获取回复的异步操作所必需的。你也可以随时阻止,但大部分时间都不建议这样做。

  • 您在这里不必要地使用QNetworkAccessManager的指针。

  • 您正在使用宏大小写字母作为常规变量名称。

您可以编写如下代码。将lambda与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