HTTP

一、描述

  1. Qt网络访问 API 是围绕 QNetworkAccessManager 对象构建的,该对象保存它发送的请求的通用配置和设置。一个 QNetworkAccessManager 实例应该足以满足整个 Qt 应用程序网络访问的需求。 由于 QNetworkAccessManager 是基于 QObject 的,所以只能在它所属的线程中使用。

2、一旦创建了 QNetworkAccessManager 对象,应用程序就可以使用它通过网络发送请求。它提供了一组标准函数,它们接受一个请求和可选数据,每个函数都返回一个 QNetworkReply 对象。返回的对象用于获取响应相应请求而返回的任何数据。

可以通过以下方式完成简单的网络下载:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished, this, &MyClass::replyFinished);
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

3、QNetworkAccessManager 有一个异步 API。 当上面的 replyFinished 槽函数被调用时,它采用的参数是 QNetworkReply 对象,包含下载的数据以及元数据(标题等)。

注意:请求完成后,用户有责任在适当的时候删除 QNetworkReply 对象。不要在连接到finished()的slot里面直接删除,可以使用 deleteLater() 函数。

注意: QNetworkAccessManager 将它收到的请求排入队列。 并行执行的请求数量取决于协议。 目前,对于桌面平台上的 HTTP 协议,一个主机/端口组合并行执行 6 个请求。

一个更复杂的例子:

QNetworkRequest request;
request.setUrl(QUrl("http://qt-project.org"));
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

QNetworkReply *reply = manager->get(request);
connect(reply, &QIODevice::readyRead, this, &MyClass::slotReadyRead);
connect(reply, &QNetworkReply::errorOccurred,this, &MyClass::slotError);
connect(reply, &QNetworkReply::sslErrors,this, &MyClass::slotSslErrors);

​​Qt网络编程:QNetworkAccessManager​​

​​Qt发起http请求,get和post方式,并接收响应数据​​

HttpServer

​​Qt开发的轻量级http服务器-QtHttpServer编译​​

下载QtHttpServer源码
​​​https://github.com/qt-labs/qthttpserver​​​

下载第三方依赖http-parser源码
​​​https://github.com/nodejs/http-parser​