C++ QT NetworkAccessManager未知错误
我试图在QT中实现一个非常简单的REST客户端,但是在我的回复中出现了一个“未知错误”。 另外,当我执行数据包捕获时,我看到0个数据包被发送到服务器 我的代码是: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
#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的指针
- 您正在使用宏大写字母作为常规变量名
您似乎误用了QtNetwork API。您至少存在以下问题:
- 您将包括整个QtNetwork模块,而不是必要的类
- 在发出error()信号之前调用errorStrin()。这是不好的,您看到的是预期的,因为默认状态是UnknownError,如文档所示
- 您没有连接到异步API的完成信号。返回的QNetworkReply只是一个指针,您可以稍后使用它访问成员,但它还不包含此时的回复
- 您正在实例化一个QCoreApplication,但实际上并没有使用它来运行事件循环,这是异步操作获取回复所必需的。您也可以始终阻止,但大多数情况下并不建议这样做
- 这里不必要地使用QNetworkAccessManager的指针
- 您正在使用宏大写字母作为常规变量名
嗨,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