Отправка 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 по умолчанию.

http://doc.qt.nokia.com/4.7/ssl.html

Несколько моментов:

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 не отправлять запрос

Другие вопросы по тегам