2017-10-13 85 views
0

這是this問題的後續處理。起初,我認爲在檢查出example from the Qt wiki(我使用相同的代碼而沒有任何更改)後問題得到了解決。然而,它似乎是導致罪魁禍首的URL。我嘗試使用this答案中提供的鏈接來測試我的http GET請求。使用HTTP請求方(火狐插件HTTP請求(GET,POST等))和curl顯示了此鏈接^沒有問題:如何正確使用QNetworkAccessManager和QNetworkReply執行http GET請求? URL如何影響Qt中的請求?

$~: curl --request GET --url "http://httpbin.org/ip" 

出於某種原因,Qt的卡和readyRead()/finished()信號發射從未。

因此,由於套接字超時而導致請求在一段時間後被取消......對於那些非常小且由Firefox在不到一秒鐘內打開的東西。

當談到Http的東西時,我離專家很遠。我想知道爲什麼這種行爲發生在Qt中,而在使用其他工具時沒有跡象。

編輯:我還測試了使用Python和其urllib

import urllib.request 
res = urllib.request.urlopen("http://httpbin.org/ip").read().decode("utf-8") 

import xml.etree.ElementTree as ET 
doc = ET.fromstring(res) 

有問題的URL和它工作得很好。很顯然,在使用Qt時會出現一些問題,或者我錯過了某些東西。

編輯2:我也嘗試了另一個HTTP請求測試服務 - https://postman-echo.com。有curl沒有問題:

$~: curl --request GET --url "https://postman-echo.com/get?foo1=bar1&foo2=bar2" 

令我驚訝的是,雖然Qt也沒有問題!我在這裏看到的唯一一個巨大差異是postman-echo.com使用HTTPS,而我嘗試過的其他URL是HTTP。我排除了https://www.qt.io這是Qt示例中的默認URL,並且工作得很好(儘管它沒有任何參數)。

+0

您仍然需要顯示您的代碼以幫助我們理解問題。 – vahancho

+0

@vahancho我使用Qt wiki中完全相同的代碼。沒有一條線改變。 – rbaleksandar

+0

爲了解決問題的根本原因,您必須回答以下問題:1)我的應用程序是否發送了正確的請求?2)應用程序是否從服務器獲取響應? 3)應用程序是否正確處理從服務器獲得的響應? – vahancho

回答

0

我忘了提及我在後面。坦率地說,我感到很愚蠢,因爲錯過了這一點,也沒有通過訪客網絡檢查工作(這繞過了愚蠢的代理)。我的一位同事嘗試使用HTTP S而不是HTTP(這是原始鏈接)。 HTTPS也是代理只是讓我們經歷沒有任何問題的東西。它的工作。

然而,一個更中立的解決方案是(正如我的同事們發現的那樣)使用QNetworkProxyFactory::setUseSystemConfiguration(true),它採用我在系統範圍內的代理配置。

0

嘗試在事件循環中執行該操作。這裏有一些類似於我在非gui應用程序中所做的事情:

QUrl req_url = QUrl(href); 
QNetworkRequest request(req_url); 

//request.setRawHeader("Content-Type", "application/json;utf8"); 
//q_nam is QNetworkAccessManager created earlier 
QNetworkReply *reply = q_nam->get(request); 

QEventLoop event_loop; 
connect(q_nam, SIGNAL(finished(QNetworkReply *)), &event_loop, SLOT(quit())); 
event_loop.exec(); // blocks stack until "finished()" has been called 
event_loop.processEvents(QEventLoop::ExcludeUserInputEvents, 500);//what events to processed and for how long 
event_loop.exit(); 

QNetworkReply::NetworkError er = reply->error(); 
// ....continue handling 
+0

不起作用,我仍然得到套接字超時。另外來自Qt wiki的例子實際上是一個小部件,但是感謝您的努力。我自己的應用程序將基於控制檯,所以很高興知道我也需要這個。 – rbaleksandar

+0

只是爲了確保我知道了 - URL是'http://bvg.hafas.de/bin/monitor_hci/stboard.exe/dn?input = 9054102&start = 1&output = xml'? – cantSleepNow

+0

兩者都不起作用 - httpbin.org和bvg.hafas.de中的一個。我已經用其他許多網址測試了應用程序,並沒有遇到任何問題。但是有了這兩個......我不知道。 – rbaleksandar