Отправка HTTP-запроса с использованием QNetworkAccessManager - PullRequest
0 голосов
/ 01 июня 2011

У меня возникла проблема при попытке отправить запрос с использованием 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 );

Теперь на этом этапе я ожидаю подождать несколько секунд, а затем получить ответ на запрос слота моего класса requestFinished.Это, однако, не называется.

Я в растерянности относительно того, что я делаю неправильно.У кого-нибудь есть идеи?(Я уверен, что это что-то глупо просто).

Редактировать : Хорошо, это очень странно.У меня есть Wireshark, собирающий пакеты в фоновом режиме, и когда я генерирую этот пост-запрос, я не вижу ничего, что происходит в Wireshark.Так почему это не отправка ??

Редактировать 2 : Хм, похоже, проблема в том, что я отправляю запрос на адрес https: // ... почему это будет ??

Ответы [ 3 ]

3 голосов
/ 02 июня 2011

Несколько баллов:

1) В потоке, к которому принадлежит ваш QNetworkRequest, должен выполняться цикл обработки событий (только так вы можете получать сигналы).

2) Если вы «подождете» с чем-то вроде sleep после mAccessManager.post, это не сработает. Вы должны позволить циклу событий повторяться для обработки сигналов и т. Д. Вы можете сами запускать цикл событий после post.

ADD:

Я сделал это синхронно, как это

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 );
0 голосов
/ 11 мая 2013

Я думаю, это потому, что QNetworkAccessManager является асинхронным и ему нужно время для отправки запроса. Но require, url, query, ... уничтожается, когда выходит за рамки.
-> нам нужно в области, когда QNetworkAccessManager действительно отправляет запрос (использует QEventLoop (). exec ();) или пусть require, url, query, ... является постоянным (объявляет его статическим). Смотрите: Qt: QNetworkAccessManager не отправляет запрос

0 голосов
/ 02 июня 2011

Хорошо, так что выясняется, что проблема вызвана тем фактом, что Qt по умолчанию не включает поддержку SSL.

...