QNetworkAccessManager理论总结

  • 一、概述
  • 二、基础用法
    • 1. 下载数据
    • 2. 上传数据
  • 二、网络和漫游支持

一、概述

QNetworkAccessManager 其实就是一个访问网络接口的管理工具类,该对象保存了它发送的请求的公共配置和设置(其实就是 QNetworkRequest 里的配置数据)。它包含代理和缓存配置,以及与此类问题相关的信号,以及可用于监视网络操作进展的应答信号,也就是下载进度、上传进度等信号。

一个QNetworkAccessManager实例对整个Qt应用程序来说就足够了。由于QNetworkAccessManager是基于QObject的,它只能从它所属的线程使用。

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

二、基础用法

1. 下载数据

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

使用的即是 get() 方法,这个就是只下载而不会回上传数据到服务器之类的,上传服务器即是要用 post() 方法

QNetworkAccessManager *manager = new QNetworkAccessManager(this);//因为是发送请求到接收到数据是异步的,replyFinished 就是处理请求完成后的槽函数
connect(manager, &QNetworkAccessManager::finished,this, &MyClass::replyFinished);//通过请求获取到数据
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

QNetworkAccessManager有一个异步API。当上面的replyFinished槽函数被调用时,它接受的参数是QNetworkReply对象,其中包含下载的数据以及元数据(首部等)。 这个get 方法只是下载

  • 注意:请求完成后,用户有责任在适当的时间删除QNetworkReply对象。不要在连接到finished()的槽内直接删除它。可以使用deleteLater()函数。
  • 注意:QNetworkAccessManager对它接收到的请求进行队列。并行执行的请求数量取决于协议。目前,对于桌面平台上的HTTP协议,一个主机/端口组合并行执行6个请求。

假设manager已经存在,下面是一个更复杂的例子:

  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, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),this, &MyClass::slotError);connect(reply, &QNetworkReply::sslErrors,this, &MyClass::slotSslErrors);

2. 上传数据

当然还可以使用 post(const QNetworkRequest &request, QIODevice *data) 方法 发送请求和数据

  • post() 函数介绍:向request指定的目的地发送一个HTTP POST请求,并返回一个新的QNetworkReply对象,该对象打开以供读取,其中将包含服务器发送的应答。数据设备的内容将被上传到服务器。
    数据必须打开以便读取,并且必须在finished()信号发出之前保持有效。

下面就是一个 上传数据到服务器的一个简单例子,QHttpMultiPart 其实就是上传MIME 数据的盒子,这个也就是上传附件之类的函数。下面就是上传一张图片和一段文本的样例。

  QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);QHttpPart textPart;textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"text\""));textPart.setBody("my text");QHttpPart imagePart;imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"image\""));QFile *file = new QFile("image.jpg");file->open(QIODevice::ReadOnly);imagePart.setBodyDevice(file);file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPartmultiPart->append(textPart);multiPart->append(imagePart);QUrl url("http://my.server.tld");QNetworkRequest request(url);QNetworkAccessManager manager;QNetworkReply *reply = manager.post(request, multiPart);multiPart->setParent(reply); // delete the multiPart with the reply// here connect signals etc.

同样还有就是用的 head() 方法,这个就是只交换头部数据,而不会传输body ,这个也是http协议的一部分。

二、网络和漫游支持

这个我用的很少,我暂时不太清楚。

随着Qt 4.7的承载管理API的增加,QNetworkAccessManager获得了管理网络连接的能力。如果设备离线,QNetworkAccessManager可以启动网络接口,如果当前进程是最后一个使用上行链路的进程,则终止该接口。请注意,有些平台从最后一个应用程序停止使用上行链路开始,一直到系统实际终止连接链路为止,都会使用宽限期。漫游同样透明。任何排队/待处理的网络请求都会自动转移到新的访问点。
想要利用这个特性的客户端不需要任何更改。事实上,很可能现有的特定于平台的连接代码可以简单地从应用程序中删除。
注意:QNetworkAccessManager的网络和漫游支持取决于支持连接管理的平台。QNetworkConfigurationManager::NetworkSessionRequired可用于检测QNetworkAccessManager是否利用此功能。

Qt扫盲-QNetworkAccessManager理论总结相关推荐

  1. Qt扫盲- QTcpSocket 理论总结

    QTcpSocket 理论总结 一.概述 二.使用 一.概述 TCP (Transmission Control Protocol)是一种可靠的.面向流的.面向连接的传输协议.它特别适合于数据的连续传 ...

  2. Qt扫盲-QProcess理论总结

    QProcess理论使用总结 一.概述 二.使用 三.通过 Channel 通道通信 四.同步进程API 五.注意事项 1. 平台特性 2. 不能实时读取 一.概述 QProcess 其实更多的是与外 ...

  3. Qt扫盲-QSqlQuery理论总结

    QSqlQuery理论总结 一.概述 二.使用 1. 数据查询 2.查询参数绑定 3. 绑定值的方法 1. 使用命名占位符的命名绑定: 2. 使用命名占位符的位置绑定: 3. 使用位置占位符绑定值(版 ...

  4. Qt扫盲-QDebug理论总结

    QDebug理论使用总结 一.概述 二.使用 1. 基础使用 2. 格式化选项 3.将自定义类型写入流 一.概述 每当开发人员需要将调试或跟踪信息写入设备.文件.字符串或控制台时,都会使用QDebug ...

  5. Qt扫盲-QSlider理论总结

    QSlider理论总结 1. 简述 2. 常用功能 3. 外观 4. 最常用信号 5. 键盘功能 1. 简述 QSlider是用于控制边界值的经典小部件.它允许用户沿水平或垂直凹槽移动QSlider ...

  6. Qt扫盲-QSystemTrayIcon理论总结

    QSystemTrayIcon理论总结 一.概述 二.使用对象 三.使用 四.常用函数介绍 1. 静态函数 2. 公共槽函数 3. 信号 一.概述 现代操作系统通常在桌面上提供一个特殊的区域,称为系统 ...

  7. Qt扫盲-QTabWidget理论总结

    QTabWidget理论总结 1. 简述 2. 用法流程 3. 选项卡设置 3. 页面信息 3. 外观 4. 扩展 1. 简述 QTabWidget 提供一个选项卡栏和一个"页面区域&quo ...

  8. Qt扫盲-QScrollArea理论总结

    QScrollArea理论总结 1. 概述 2. 滚动条策略 3. 子控件 4. 尺寸提示 1. 概述 QScrollArea 用于显示滚动区域框架内的子控件的内容.如果控件超过框架的大小,视图可以提 ...

  9. Qt扫盲-QLineEdit理论总结

    QLineEdit理论总结 1. 简述 2. 输入模式 3. 输入限制 4. 文本操作槽函数 3. 信号 4. 快捷键 5. 外观 1. 简述 QLineEdit 是一个有用的编辑功能类,主要是处理输 ...

最新文章

  1. 【Android UI设计与开发】第09期:底部菜单栏(四)Fragment+PopupWindow仿QQ空间最新版底部菜单栏
  2. 上海网络推广为大家讲解细节标签能给网站带来的作用与效果!
  3. python爬虫实例解析-Python(爬虫)- 动态加载案例分析
  4. tf.arg_min
  5. Python常见问题(6):Python在Windows上的问题 Python on Windows FAQ
  6. python人脸识别opencv_用python和opencv 做人脸识别
  7. Cannot modify the value of a static config: spark.sql.queryExecutionListeners
  8. python做算法题_Python 笔试常见基础算法题
  9. Python数据分析之数据聚合与分组运算
  10. 文件服务器和ftp服务器的区别
  11. 亚马逊云计算平台---------AWS(一)
  12. is not backed by gradle android,Module … is not backed by gradle
  13. tp5 微信分享朋友或朋友圈
  14. 给定秒数计算小时分钟(时间转换)
  15. 判断用户输入的年份(平年或闰年)
  16. Android studio安装教程(2020/11/20最新版本的安装)
  17. 技术干货 | 人大金仓KFS基于分区索引的分片入库技术解析
  18. 信息技术服务标准(ITSS)
  19. STM32CubeIDE移植标准库
  20. android xutils 注解,android Xutils dbutils 注解

热门文章

  1. Xilinx MIG DDR3 控制器 Modelsim 仿真
  2. 怎么把计算机桌面的文件固定到任务栏,win10如何将桌面我的电脑固定到任务栏 - 卡饭网...
  3. 自我学习汇总:SpringBoot篇
  4. 8月30日云栖精选夜读:Nodejs进阶:使用DiffieHellman密钥交换算法
  5. python有三种序列结构_Python 序列结构小练习
  6. Android 微信支付调不起
  7. win7如何打开微软更新服务器地址,win7系统更新设置在哪里?小编告诉你
  8. 对比说明生物神经元与人工神经元结构与功能之间的差异
  9. 微信:多闪、聊天宝、马桶MT同时上线?封杀!
  10. linux中写入log日志,Linux往log中写日志