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 );

现在,在这一点上,我希望等待几秒钟,然后收到对我班级的 slot requestFinished 的响应。但是它没有被调用。

我不知道我做错了什么。有人有什么想法吗?(我敢肯定它非常简单)。

编辑:好的,这很奇怪。我有wireshark在后台收集数据包,当我生成那个post请求时,我没有看到wireshark发生任何事情。那为什么不发送呢??

编辑2:嗯,问题似乎在于我向https://地址发送请求......为什么会这样?

4

3 回答 3

3

几点:

1)您的 QNetworkRequest 所属的线程必须正在运行事件循环(只有这样您才能接收信号)。

2)如果您“等待”类似sleepaftermAccessManager.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 ......是持久的(用静态声明它)时,我们需要在范围内。请参阅:Qt:QNetworkAccessManager 不发送请求

于 2013-05-11T07:52:48.447 回答