gpt4 book ai didi

c++ - QT NetworkAccessManager 未知错误

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:12 29 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

  • 您正在实例化 QCoreApplication,但实际上并没有使用它来运行事件循环,而事件循环对于获取回复的异步操作来说是必需的。您也可以随时阻止,但大多数时候并不真正推荐这样做。

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

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

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

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();
}

主程序

TEMPLATE = app
TARGET = main
QT = core network
SOURCES += main.cpp

构建并运行

qmake && make

关于c++ - QT NetworkAccessManager 未知错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21009234/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com