0

QObject派生クラスからQNetworkAccessManagerを使用してリクエストを送信しようとすると問題が発生します。

まず、コンストラクターで次のことを行います。

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がパケットを収集していますが、そのPOSTリクエストを生成すると、wiresharkでは何も起こりません。では、なぜ送信しないのですか?

編集2:うーん、問題は私がhttps://アドレスにリクエストを送信することにあるようです...なぜそうなるのでしょうか??

4

3 に答える 3

3

いくつかのポイント:

1)QNetworkRequestが属するスレッドは、イベントループを実行している必要があります(この方法でのみシグナルを受信できます)。

sleep2)動作しなくなった後などで「待つ」場合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 );
于 2011-06-01T20:40:09.907 に答える
0

さて、問題はQtにデフォルトでSSLサポートが含まれていないという事実が原因であることがわかりました。

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

于 2011-06-02T17:45:31.733 に答える
0

これは、QNetworkAccessManagerが非同期であり、リクエストを送信するための時間が必要なためだと思います。ただし、require、url、query、...は、スコープ外になると破棄されます。
-> QNetworkAccessManagerがリクエストを送信する(QEventLoop()。exec();を使用する)か、require、url、query、...を永続化する(staticで宣言する)場合は、スコープ内で必要です。参照:Qt:QNetworkAccessManagerはリクエストを送信しません

于 2013-05-11T07:52:48.447 に答える