代码之家  ›  专栏  ›  技术社区  ›  Ruel

在Qt中发出HTTP请求

  •  4
  • Ruel  · 技术社区  · 15 年前

    我是新来的 夸脱 . 我安装了Qt for VS2008并与我的 VS2010年 . 我只想知道如何发出HTTP请求。我听说过 QT网络 但是QtHttp是obselete。

    我也知道 利勃曲尔 卷发 ,但我在安装它和使它与Qt一起工作时遇到了问题。

    你有什么建议, QT网络 卷发 ? 如果 QT网络 ,请给我一个示例函数或一段代码(以及使用什么类)。如果 卷曲(libcurl) ,你能给我指一个我能找到安装步骤的地方吗 夸脱 (或善意解释)?

    非常感谢你。

    2 回复  |  直到 15 年前
        1
  •  6
  •   Giuseppe Cardone    12 年前

    利勃曲尔 卷发 是很好的库,但是使用它们会给您的项目添加一个依赖项,您可能可以避免。

    建议使用最新版本的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 .

        2
  •  5
  •   ZolaKt    15 年前

    朱塞佩是对的,你不需要用 利勃曲尔 , 卷发 以及类似的图书馆。 没有必要这样做,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。它有一个很好的模拟器和一个完整的移动设备测试工具链。