【问题标题】:QT NetworkAccessManager Unknown ErrorQT NetworkAccessManager 未知错误
【发布时间】:2014-01-09 00:07:16
【问题描述】:

我正在尝试在 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 客户端成功测试。

【问题讨论】:

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


    【解决方案1】:

    您似乎在滥用 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
    

    【讨论】:

    • 嗨 Laszlo,&Download 未声明,我应该将其声明为什么? (我对 QT 很陌生)
    • 我试图复制和替换我的项目(main.pro 和 main.cpp),但现在它说“找不到用于 arch.x86_64 的符号”。奇怪吧?顺便说一句,这两个文件是我项目中唯一的东西。
    • @user1873432:您正在混淆架构。获取包含您想要构建的拱门的库。
    • Laszlo,它与我之前编写的代码编译得很好(尽管我当然不想要它)。有关该问题的更多信息:体系结构 x86_64 的未定义符号:“vtable for Download”,引用自:Download::Download(QObject*) in main.o 注意:缺少 vtable 通常意味着第一个非内联虚拟成员函数没有定义。我使用的是 Mac,所以在 QT 中没有可以混合的 32 位库(至少我是这么认为的)。你知道如何避免在这种情况下混合库吗?
    • @user1873432:您显然没有重新运行 qmake。这并不难,真的。 :)
    猜你喜欢
    • 2014-04-09
    • 2019-06-27
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多