在Qt中发出HTTP请求

时间:2010-11-18 10:45:58

标签: visual-studio-2010 qt libcurl curlpp qtnetwork

我是 Qt 的新手。我为VS2008安装了Qt并与我的 VS2010 集成。我只是想知道如何发出HTTP请求。我读过关于 QtNetwork 的信息,但是QtHttp很有用。

我也知道 libcurl curlpp ,但我在安装它时遇到了问题,并使其与Qt一起使用。

您推荐什么, QtNetwork curlpp ?如果 QtNetwork ,您能否给我一个示例函数或一段代码(以及要使用的类)。如果 curlpp(libcurl),您能否指点我找到安装 Qt (或善解释)的步骤?

非常感谢。

2 个答案:

答案 0 :(得分:6)

libcurl curlpp 是很棒的库,但使用它们会为您的项目添加依赖项,这可能是您可以避免的。

最近的Qt版本建议使用QNetworkAccessManager发出网络请求(包括http请求)并接收回复。

下载文件的最简单方法是:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://stackoverflow.com")));

调用replyFinished插槽时,作为参数的QNetworkReply对象将包含下载的数据以及元数据(标题等)。

可以在Qt示例中找到更完整的示例,您可以read here its source code

答案 1 :(得分:5)

Giuseppe是对的,您不需要使用 libcurl curlpp 和类似的库。 没有必要,Qt有一个简单的工作级别。

请记住,发送请求和检索回复的标准方式是异步的。 您始终必须将经理完成(QNetworkReply *)信号连接到插槽。

如果发送多个请求并且不想为每个回复添加一个插槽,则可以始终运行事件循环,并将管理器信号连接到事件循环quit()插槽。

这样的事情:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QEventLoop *eventLoop = new QEventLoop();
QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), eventLoop, SLOT(quit());

manager->get(QNetworkRequest(QUrl("http://stackoverflow.com")));
eventLoop->exec(QEventLoop::ExcludeUserInputEvents);

QByteArray replyData = reply->readAll();
... //do what you want with the data your receive from reply

顺便说一下。不知道你在做什么。但如果它是一个移动应用程序,我会建议你从VS切换到QtCreator IDE。它有一个很好的模拟器和一个完整的移动设备测试工具链。