質問

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
.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top