Qt NetworkAccessManager未知错误
-
21-12-2019 - |
题
我正在尝试在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”,并使用curl使用php客户端成功测试。
解决方案
似乎滥用了QTNetwork API。您至少至少持续了以下问题:
-
您包括整个QTNetwork模块,而不是必要的类。
-
您在发出错误()信号之前调用errorstrin()。这不好,以及您所看到的,因为默认状态是根据文档的UnknownError。
-
您未连接到异步API的完成信号。返回的qnetworkReply只是一个指针,您可以稍后用来访问成员,但它尚未包含此点的回复。
-
您实例化了QcoreApplication,但实际上并未使用它来运行事件循环,这对于获得回复的异步操作是必需的。你也可以块,但大部分时间都不是真正推荐的。
-
您正在使用指针为qnetworkaccessManager此处不必要地。
-
您正在使用常规变量名称的宏观大写字母。
您可以写下面的一些代码。使用C ++ 11使用lambda更简单,但我假设您需要使用前预先编译器使用它。
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
. 不隶属于 StackOverflow