QT NetworkAccessManager不明なエラー
-
21-12-2019 - |
質問
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です。
のデフォルトの状態はunnownErrorであるため、これは良くないものです。
-
非同期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
.