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