这是对this问题的跟进。一开始我认为问题在签出example from the Qt wiki后解决了(我使用相同的代码而没有一次更改)。然而,它似乎是作为罪魁祸首的URL。我尝试使用this answer中提供的链接来测试我的http GET请求。使用Http Requester(用于Http请求的Firefox插件(GET,POST等))和curl
显示此链接没有问题^:
$~: 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)
它工作得很好。显然,在使用Qt时会发生一些事情和/或我遗漏了一些东西。
EDIT2 :我还尝试了另一项针对HTTP请求的测试服务 - https://postman-echo.com。使用curl
时没有问题:
$~: curl --request GET --url "https://postman-echo.com/get?foo1=bar1&foo2=bar2"
令我惊讶的是,Qt也没有问题!我在这里看到的唯一不同的是,postman-echo.com
使用HTTPS,而我尝试的其他网址是HTTP。我排除了https://www.qt.io
这是Qt示例中的默认网址并且运行得很好(尽管它没有任何参数)。
答案 0 :(得分: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
答案 1 :(得分:0)
我忘了提到我落后了。坦率地说,我觉得因为错过了这一点而感到相当愚蠢,也没有在工作中检查来宾网络(这绕过了愚蠢的代理)。我的一位同事尝试使用HTTP S 而不是HTTP(这是原始链接)。 HTTPS也是代理只允许通过而没有任何问题的东西。它起作用了。
然而,一个更中立的解决方案是(正如我的同事发现的那样)使用QNetworkProxyFactory::setUseSystemConfiguration(true)
来获取我在系统范围内的代理配置。