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

时间:2017-10-13 07:40:48

标签: c++ qt http url http-get

这是对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示例中的默认网址并且运行得很好(尽管它没有任何参数)。

2 个答案:

答案 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)来获取我在系统范围内的代理配置。