发送使用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://地址发送请求......为什么会这样?
的几点:
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);
及其对我的主UI线程运行。后调用函数返回并控制返回到主UI线程。仍然没有得到信号,虽然:( – Goz 2011-06-02 13:13:48
我想这是因为QNetworkAccessManager是异步的,需要时间来发送请求。但是,当超出范围时,需要url,query,...被销毁。
- >我们需要的范围时QNetworkAccessManager做派的请求(使用QEventLoop()EXEC();)或让需要,网址,查询,...是持久的(静态声明它)。请参阅:Qt: QNetworkAccessManager dont send request
你引用指出,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