문제

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가 있기 때문에 예상되는 것입니다.

  • ASYNC API의 완성 된 신호에 연결하지 않습니다. 반환 된 QNetworkReply는 나중에 멤버에 액세스 할 수있는 포인터 일뿐 만 아니라 아직 해당 시점에서 답장을 포함하지 않습니다.

  • QCoreApplication을 인스턴스화하지만 실제로 답장을 얻기 위해 비동기 작업에 필요한 이벤트 루프를 실행하기 위해 실제로 사용하지는 않습니다. 당신은 언제나 블록도 차단할 수 있지만, 그것은 대부분의 시간을 추천하지는 않습니다.

  • 여기에서 qnetworkaccessmanager의 포인터를 사용하지 않습니다.

  • 일반 변수 이름에 매크로의 대문자를 사용하고 있습니다.

아래와 같은 코드를 작성할 수 있습니다. 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