2011-06-01 126 views
0

我得嘗試發送使用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://地址發送請求......爲什麼會這樣?

回答

0

好了,所以它原來的問題是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

2

的幾點:

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

0

我想這是因爲QNetworkAccessManager是異步的,需要時間來發送請求。但是,當超出範圍時,需要url,query,...被銷燬。
- >我們需要的範圍時QNetworkAccessManager做派的請求(使用QEventLoop()EXEC();)或讓需要,網址,查詢,...是持久的(靜態聲明它)。請參閱:Qt: QNetworkAccessManager dont send request

相關問題