Отправка HTTP-запроса с использованием QNetworkAccessManager
У меня проблема при попытке отправить запрос с помощью QNetworkAccessManager из производного класса QObject.
Сначала в конструкторе я делаю следующее:
QObject::connect( &mAccessManager, SIGNAL( finished( QNetworkReply* ) ), this, SLOT( requestFinished( QNetworkReply* ) ) );
Затем, когда я хочу отправить запрос, я делаю следующее:
QNetworkRequest checkLogin( QUrl( address ) );
checkLogin.setHeader( QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded" );
mByteArray = QByteArray( "POST \"client\" : oxres" );
QNetworkReply* pReply = mAccessManager.post( checkLogin, mByteArray );
Теперь на этом этапе я ожидаю подождать несколько секунд и затем получить ответ на запрос слота моего класса. Однако это не называется.
Я в растерянности относительно того, что я делаю неправильно. У кого-нибудь есть идеи? (Я уверен, что это что-то глупо просто).
Редактировать: Хорошо, это очень странно. У меня есть Wireshark, собирающий пакеты в фоновом режиме, и когда я генерирую этот пост-запрос, я не вижу ничего, что происходит в Wireshark. Так почему это не отправка??
Редактировать 2: Хм, похоже, проблема заключается в том, что я отправляю запрос на адрес https://... с чего бы это??
3 ответа
Итак, получается, что проблема вызвана тем фактом, что Qt не включает поддержку SSL по умолчанию.
Несколько моментов:
1) В потоке, к которому принадлежит ваш QNetworkRequest, должен выполняться цикл обработки событий (только так вы можете получать сигналы).
2) Если ты "подожди" с чем-то вроде sleep
после mAccessManager.post
это не сработает. Вы должны позволить циклу событий повторяться для обработки сигналов и т. Д. Вы можете запустить цикл событий самостоятельно после post
,
ДОБАВЛЯТЬ:
Я сделал это синхронно, как это
QNetworkRequest request;
request.setHeader(
QNetworkRequest::ContentTypeHeader,
QVariant( QString("text/xml") )
);
request.setHeader(
QNetworkRequest::ContentLengthHeader,
QVariant( qulonglong(mesPOST.size()) )
);
request.setHeader(...);
//etc....
request.setAttribute(
QNetworkRequest::CacheLoadControlAttribute,
QVariant( int(QNetworkRequest::AlwaysNetwork) )
);
request.setUrl( QUrl( "http://bla.bla", QUrl::StrictMode ) );
QNetworkReply* pReply = m_NetMgr->post( request, mesPOST );
QEventLoop eLoop;
QObject::connect( pReply, SIGNAL(finished()), &eLoop, SLOT(quit()) );
eLoop.exec( QEventLoop::ExcludeUserInputEvents );
Я думаю, это потому, что QNetworkAccessManager является асинхронным и требует времени для отправки запроса. Но require, url, query, ... уничтожается, когда выходит из области видимости.
-> нам нужно в области, когда QNetworkAccessManager действительно отправляет запрос (использует QEventLoop().exec();) или пусть require, url, query, ... является постоянным (объявляет его статическим). Смотрите: Qt: QNetworkAccessManager не отправлять запрос