发送使用QNetworkAccessManager

问题描述:

我得尝试发送使用QNetworkAccessManager从一个QObject派生类的请求有问题的HTTP请求。发送使用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在后台收集数据包,当我生成该帖子请求时,我看到wireshark中没有任何事情发生。那为什么不发送?

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

好了,所以它原来的问题是BYT的事实,Qt不包括由默认SSL支持所致。

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

+1

你引用指出,QT不支持默认SSL的页面,但它动态地加载DLL的OpenSSL默认情况下,这意味着OpenSSL的DLL有当您运行可执行文件可在您的系统。也可以编译QT来导入OpenSSL符号(而不是在运行时动态加载它们),这意味着如果您链接到DLL版本的OpenSSL(当您构建QT DLL时),如果没有OpenSSL DLL可用,您的可执行文件甚至不会运行。或者,如果您将QT DLL与静态OpenSSL链接在一起,那么您完全不需要OpenSSL DLL。 – 2011-06-02 20:12:48

的几点:

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

及其对我的主UI线程运行。后调用函数返回并控制返回到主UI线程。仍然没有得到信号,虽然:( – Goz 2011-06-02 13:13:48

我想这是因为QNetworkAccessManager是异步的,需要时间来发送请求。但是,当超出范围时,需要url,query,...被销毁。
- >我们需要的范围时QNetworkAccessManager做派的请求(使用QEventLoop()EXEC();)或让需要,网址,查询,...是持久的(静态声明它)。请参阅:Qt: QNetworkAccessManager dont send request