如何正确使用QNetworkAccessManager和QNetworkReply执行http GET请求? URL如何影响Qt中的请求?

问题描述:

这是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

我忘了提及我在后面。坦率地说,我感到很愚蠢,因为错过了这一点,也没有通过访客网络检查工作(这绕过了愚蠢的代理)。我的一位同事尝试使用HTTP S而不是HTTP(这是原始链接)。 HTTPS也是代理只是让我们经历没有任何问题的东西。它的工作。

然而,一个更中立的解决方案是(正如我的同事们发现的那样)使用QNetworkProxyFactory::setUseSystemConfiguration(true),它采用我在系统范围内的代理配置。

尝试在事件循环中执行该操作。这里有一些类似于我在非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