我在尝试使用 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 );
此时,我希望等待几秒钟,然后收到对我的类(class)插槽请求完成的响应。但是它不会被调用。
我不知道自己做错了什么。有人有什么想法吗? (我确定它非常简单)。
编辑:好的,这很奇怪。我有 wireshark 在后台收集数据包,当我生成该发布请求时,我看不到 wireshark 中发生了什么。那为什么不发送呢??
编辑 2:嗯,问题似乎出在我向 https://地址发送请求……为什么会这样??
最佳答案
几点:
1)你的QNetworkRequest所属的线程必须正在运行事件循环(只有这样你才能接收到信号)。
2) 如果您在 mAccessManager.post
之后用类似 sleep
的东西“等待”,它将无法工作。您必须让事件循环迭代以处理信号等。您可以在 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 );
关于c++ - 使用 QNetworkAccessManager 发送 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6204621/