C++ QT NetworkAccessManager未知错误

C++ QT NetworkAccessManager未知错误,c++,qt,qnetworkaccessmanager,qtnetwork,qt-signals,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); QNetworkAcces

我试图在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;
 }
#包括
#包括
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
QNetworkAccessManager*网络=新的QNetworkAccessManager();
网络->设置网络可访问(QNetworkAccessManager::可访问);
QNetworkRequest请求;
REQUEST.setUrl(QUrl(“http://test.com/test/rest/BOB"));
QNetworkReply*回复=网络->获取(请求);
qDebug()错误字符串();
返回0;
}
我的结果是:未知错误

简单的应用程序在编译时不会出现错误或警告

有人看到什么问题吗


我的预期输出是“Hello BOB”,并使用Curl在PHP客户端上成功测试。

您似乎误用了QtNetwork API。您至少存在以下问题:

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

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

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

  • 您正在实例化一个QCoreApplication,但实际上并没有使用它来运行事件循环,这是异步操作获取回复所必需的。您也可以始终阻止,但大多数情况下并不建议这样做

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

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

您可以编写如下代码。将lambda与C++11结合使用会更简单,但我假设您需要让它与预编译程序一起工作

main.cpp 构建并运行
您似乎误用了QtNetwork API。您至少存在以下问题:

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

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

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

  • 您正在实例化一个QCoreApplication,但实际上并没有使用它来运行事件循环,这是异步操作获取回复所必需的。您也可以始终阻止,但大多数情况下并不建议这样做

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

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

您可以编写如下代码。将lambda与C++11结合使用会更简单,但我假设您需要让它与预编译程序一起工作

main.cpp 构建并运行
嗨,Laszlo,&下载未声明,我声明它是什么?(我对QT相当陌生)我试图复制和替换我的项目(main.pro和main.cpp),但现在它说“arch.x86_64找不到符号”。奇怪吧?顺便说一句,这两个文件是我项目中唯一的东西。@user1873432:你把架构搞混了。获取您想要为.Laszlo构建的arch库,它使用我之前编写的代码编译得很好(当然,我并不想要它)。有关此问题的更多信息:架构x86_64的未定义符号:“用于下载的vtable”,引用自main中的:Download::Download(QObject*)。注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。我使用Mac,所以在QT中没有32位库可以混合使用(至少我是这么认为的)。您知道如何避免将库与此混合吗?@user1873432:您显然没有重新运行qmake。其实没那么难。:)嗨,Laszlo,&下载未声明,我声明它是什么?(我对QT相当陌生)我试图复制和替换我的项目(main.pro和main.cpp),但现在它说“arch.x86_64找不到符号”。奇怪吧?顺便说一句,这两个文件是我项目中唯一的东西。@user1873432:你把架构搞混了。获取您想要为.Laszlo构建的arch库,它使用我之前编写的代码编译得很好(当然,我并不想要它)。有关此问题的更多信息:架构x86_64的未定义符号:“用于下载的vtable”,引用自main中的:Download::Download(QObject*)。注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。我使用Mac,所以在QT中没有32位库可以混合使用(至少我是这么认为的)。您知道如何避免将库与此混合吗?@user1873432:您显然没有重新运行qmake。其实没那么难。:)
#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();
}
TEMPLATE = app
TARGET = main
QT = core network
SOURCES += main.cpp
qmake && make