Qt网络编程:QNetworkReply

2023-11-03

一、描述

QNetworkReply 类封装了使用 QNetworkAccessManager 发布的请求相关的回复信息。

QNetworkReply 是 QIODevice的子类,这意味着一旦从对象中读取数据,它就不再由设备保留。因此,如果需要,应用程序有责任保留这些数据。

注意:不要删除连接到errorOccurred() 或finished() 信号的槽中的对象。应该使用使用 deleteLater()。


二、类型成员

1、enum QNetworkReply::NetworkError:指示在处理请求期间发现的所有可能的错误情况。

  • NoError:没有错误。(当 HTTP 协议返回重定向时,不会报告错误。可以使用 QNetworkRequest::RedirectionTargetAttribute 属性检查是否存在重定向)
  • ConnectionRefusedError:远程服务器拒绝连接。
  • RemoteHostClosedError:远程服务器在接收和处理整个回复之前过早关闭了连接。
  • HostNotFoundError:未找到远程主机名(无效主机名)。
  • TimeoutError:与远程服务器的连接超时。
  • OperationCanceledError:操作在完成之前通过调用 abort() 或 close() 被取消。
  • SslHandshakeFailedError:SSL/TLS 握手失败,无法建立加密通道。 sslErrors() 信号应该已经发出。
  • TemporaryNetworkFailureError:由于与网络断开连接,连接中断,但系统已开始漫游到另一个接入点。 应重新提交请求,并在重新建立连接后立即进行处理。
  • NetworkSessionFailedError:由于与网络断开连接或无法启动网络,连接中断。
  • BackgroundRequestNotAllowedError:由于平台政策,当前不允许后台请求。
  • TooManyRedirectsError:在跟随重定向时,达到了最大限制。 该限制默认设置为 50 或由 QNetworkRequest::setMaxRedirectsAllowed() 设置。 
  • InsecureRedirectError:在跟踪重定向时,网络访问 API 检测到从加密协议 (https) 到未加密协议 (http) 的重定向。
  • ProxyConnectionRefusedError:与代理服务器的连接被拒绝(代理服务器不接受请求)。
  • ProxyConnectionClosedError:代理服务器在接收和处理整个回复之前过早地关闭了连接。
  • ProxyNotFoundError:未找到代理主机名(无效的代理主机名)。
  • ProxyTimeoutError:与代理的连接超时或代理没有及时回复发送的请求。
  • ProxyAuthenticationRequiredError:代理需要身份验证才能满足请求,但不接受任何提供的凭据(如果有)。
  • ContentAccessDenied:对远程内容的访问被拒绝(类似于 HTTP 错误 403)。
  • ContentOperationNotPermittedError:不允许对远程内容请求的操作。
  • ContentNotFoundError:在服务器上找不到远程内容(类似于 HTTP 错误 404)。
  • AuthenticationRequiredError:远程服务器需要身份验证才能提供内容,但不接受提供的凭据(如果有)。
  • ContentReSendError:需要再次发送请求,但由于无法再次读取上传数据而失败。
  • ContentConflictError:由于与资源的当前状态冲突,无法完成请求。
  • ContentGoneError:请求的资源在服务器上不再可用。
  • InternalServerError:服务器遇到意外情况,无法完成请求。
  • OperationNotImplementedError:服务器不支持满足请求所需的功能。
  • ServiceUnavailableError:服务器此时无法处理请求。
  • ProtocolUnknownError:网络访问 API 无法接受请求,因为协议未知。
  • ProtocolInvalidOperationError:请求的操作对该协议无效。
  • UnknownNetworkError:检测到与网络相关的未知错误。
  • UnknownProxyError:检测到与代理相关的未知错误。
  • UnknownContentError:检测到与远程内容相关的未知错误。
  • ProtocolFailure:检测到协议故障(解析错误、无效或意外响应等)。
  • UnknownServerError:检测到与服务器响应相关的未知错误。

三、成员函数

1、void abort()

立即中止操作并关闭所有仍打开的网络连接。仍在进行中的上传会中止,finished() 信号也将被发射。

2、[signal] void downloadProgress(qint64 bytesReceived, qint64 bytesTotal)

发出此信号以指示此网络请求的下载部分的进度(如果有)。如果没有与此请求关联的下载,则此信号将发出一次,bytesReceived 和 bytesTotal 的值都为0。

bytesReceived 指示接收的字节数,bytesTotal 指示预期下载的总字节数。如果要下载的字节数未知,bytesTotal 将为 -1。当 bytesReceived 等于 bytesTotal 时,下载完成。

请注意,bytesReceived 和 bytesTotal 的值可能与 size()、通过 read() 或 readAll() 获取的总字节数或 header(ContentLengthHeader) 的值不同。原因是可能存在协议开销或数据在下载过程中可能被压缩。

3、[signal] void encrypted()

当 SSL/TLS 会话成功完成初始握手时,会发出此信号。此时还没有传输用户数据。此信号可用于对证书链执行额外检查,例如在网站证书更改时通知用户。如果回复与预期标准不匹配,则应通过连接到此信号的插槽调用 abort() 来中止。 可以使用 sslConfiguration() 方法检查正在使用的 SSL 配置。

4、[signal] void errorOccurred(QNetworkReply::NetworkError code)

出现错误时发出此信号。代码参数包含检测到的错误代码。调用 errorString() 以获取错误条件的文本表示。

5、[signal] void finished()

当回复完成处理时发出此信号。发出此信号后,将不再更新回复的数据。

除非调用 close() 或 abort() ,否则仍将打开回复以供读取,因此可以通过调用 read() 或 readAll() 来检索数据。特别是,如果 readyRead() 的结果没有调用 read(),则调用 readAll() 将检索 QByteArray 中的全部内容。

此信号与 QNetworkAccessManager::finished() 一起发出,该信号的回复参数是此对象。

6、void ignoreSslErrors()

如果调用此函数,将忽略与网络连接相关的 SSL 错误,包括证书验证错误。

警告:应确保始终让用户检查 sslErrors() 信号报告的错误,并且只有在用户确认继续正常后才调用此方法。如果出现意外错误,则应中止回复。在不检查实际错误的情况下调用此方法很可能会给应用程序带来安全风险。应小心使用此函数!

可以从连接到 sslErrors() 信号的插槽调用此函数,该信号指示发现了哪些错误。

注意:如果 QNetworkAccessManager 启用了 HTTP Strict Transport Security,则此功能无效。

7、[signal] void metaDataChanged()

每当元数据发生更改时,都会发出此信号。元数据是任何不属于内容(数据)本身的信息,包括网络标头。

8、[signal] void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)

如果 SSL/TLS 握手协商 PSK 密码套件,则会发出此信号,因为需要 PSK 身份验证。

使用 PSK 时,客户端必须向服务器发送一个有效的身份和一个有效的预共享密钥,以便 SSL 握手继续进行。 应用程序可以在连接到这个信号的槽中提供这个信息,通过根据他们的需要填充传递的验证器对象。

注意:忽略此信号,或未能提供所需的凭据,将导致握手失败,从而中止连接。

9、[signal] void redirected(const QUrl &url)

如果在请求中设置了 FollowRedirectsAttribute 并且服务器以 3xx 状态(特别是 301、302、303、305、307 或 308 状态代码)在location header中带有有效的 url(如:header("Location: http://www.baidu.com/")),则发出此信号,指示 HTTP 重定向。url 参数包含服务器在location header中返回的新重定向 url。

10、[signal] void redirectAllowed()

当处理 redirected() 信号的客户端代码验证了新 URL 时,会发出此信号以允许重定向继续进行。 适用于重定向策略设置为 UserVerifiedRedirectPolicy 的网络请求。

11、[signal] void sslErrors(const QList &errors)

如果 SSL/TLS 会话在设置期间遇到错误,包括证书验证错误,则会发出此信号。errors 参数包含错误列表。

如果错误不是致命的并且连接应该继续,应该从连接到此信号的槽函数调用 ignoreSslErrors() 。如果未调用,则在交换任何数据(包括 URL)之前,SSL 会话将被结束。

此信号可用于向用户显示错误消息,指示安全性可能受到威胁并显示 SSL 设置。如果用户在分析远程证书后决定继续连接,则槽函数应调用 ignoreSslErrors()。

12、[signal] void uploadProgress(qint64 bytesSent, qint64 bytesTotal)

发出此信号以指示此网络请求的上传部分的进度(如果有)。 如果没有与此请求关联的上传,则不会发出此信号。

bytesSent 表示上传的字节数,bytesTotal 表示要上传的总字节数。 如果无法确定要上传的字节数,则 bytesTotal 将为 -1。当 bytesSent 等于 bytesTotal 时,上传完成。

13、void close()

关闭此设备。未读的数据会被丢弃,但网络资源直到读完才被释放。如果有任何上传正在进行,它将一直持续到完成。当所有操作结束并且网络资源被释放时,finished() 信号被发出。

14、bool hasRawHeader(const QByteArray &headerName)

如果名称 headerName 的原始标头是由远程服务器发送的,则返回 true。

15、void ignoreSslErrors(const QList<QSslError> &errors)

列表中给出的 SSL 错误将被忽略。

注意:由于大多数 SSL 错误都与证书相关联,因此对于其中的大多数错误,必须设置与 SSL 错误相关的预期证书。例如,如果您想向使用自签名证书的服务器发出请求,请考虑以下代码段:

 QList<QSslCertificate> cert = QSslCertificate::fromPath(QLatin1String("server-certificate.pem"));
 QSslError error(QSslError::SelfSignedCertificate, cert.at(0));
 QList<QSslError> expectedSslErrors;
 expectedSslErrors.append(error);

 QNetworkReply * reply = manager.get(QNetworkRequest(QUrl("https://server.tld/index.html")));
 reply->ignoreSslErrors(expectedSslErrors);

注意:如果 QNetworkAccessManager 启用了 HTTP Strict Transport Security,则此功能无效。

16、void ignoreSslErrorsImplementation(const QList<QSslError> &errors)

虚函数,作用是供用户自定义内容以覆盖 ignoreSslErrors() 。参数列表是用户希望忽略的错误。

 ignoreSslErrors()实际上是调用的ignoreSslErrorsImplementation():

17、bool isFinished() 

是否回复完成或中止。

18、bool isRunning()

isFinished() 相反。

19、QNetworkAccessManager *manager()

返回用于创建此 QNetworkReply 对象的 QNetworkAccessManager。

20、QList<QByteArray> rawHeaderList()

返回远程服务器发送的标头字段列表,按发送顺序排列。

21、QNetworkRequest request()

返回为此回复发布的请求。特别要注意,请求的 URL 可能与回复的 URL 不同。

22、QByteArray rawHeader(const QByteArray &headerName) 

返回远程服务器发送的标头 headerName 的原始内容。 如果没有这样的标头,则返回一个空字节数组,它可能与空标头无法区分。 使用 hasRawHeader() 来验证服务器是否发送了这样的头字段。

23、QVariant header(QNetworkRequest::KnownHeaders header)

如果该标头是由远程服务器发送的,则返回已知标头标头的值。如果未发送标头,则返回无效的 QVariant。

24、QSslConfiguration sslConfiguration()

如果使用了 SSL,则返回与此回复关联的 SSL 配置和状态。

25、QUrl url()

返回下载或上传的内容的 URL。 请注意,该 URL 可能与原始请求的 URL 不同。 如果在请求中设置了 QNetworkRequest::FollowRedirectsAttribute,则此函数返回正在访问的当前 url,即 redirected() 信号中发出的 url。

26、qint64 readBufferSize()

返回读取缓冲区的大小,以字节为单位。从网络下载的数据保存到读写缓冲区,然后再使用 QIODevice::read() 读取。此值为 0 表示读写缓冲区的大小不受限制。
一旦该缓冲区已满(即,bytesAvailable() 返回大小或更多),QNetworkReply 将尝试停止从网络读取,从而导致下载也受到限制。 如果缓冲区的大小没有限制,QNetworkReply 将尝试尽快从网络下载。
QAbstractSocket::setReadBufferSize() 不同,QNetworkReply 不能保证读取缓冲区大小的精度。也就是说, QIODevice::bytesAvailable() 可以返回大于 readBufferSize() 的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt网络编程:QNetworkReply 的相关文章

  • 迁移学习概述

    1 迁移学习的背景 在有监督的机器学习和尤其是深度学习的场景应用中 需要大量的标注数据 标注数据是一项枯燥无味且花费巨大的任务 关键是现实场景中 往往无法标注足够的数据 而且模型的训练是极其耗时的 因此迁移学习营运而生 传统机器学习 主要指
  • markdown语法介绍

    目录 动态目录 toc 文章目录 目录 一 标题和文本 1 使用 和 标记一级和二级标题 2 使用 号标记 3 换行 二 文字标记和插入图片 链接 1 插入链接 2 插入图片 3 文字标记 设置文字 删除线 下划线 上标 下标 注释 4 e
  • Flip card 卡片翻转效果

    鼠标滑过 卡片翻转 如果想要点击卡片翻转的话就把 hover 改成 hover 然后自己添加点击事件 添加 class hover
  • Java序列化

    Java序列化 原理图 0bjectoutputstream java io 0bjectoutputstream extends outputstreamobjectoutputstream 对象的序列化流 作用 把对象以流的方式写入到文
  • 以太坊合并后,Layer2 何去何从?

    转载原文链接 http www btcwbo com 5671 html 在2022年以太坊开发者峰会上 联合创始人威尔基说 以太坊预计将信号标准链与主网络合并 通过8月份的TheMerge 合并 升级 这样以太坊就可以证明 POS 共识算
  • 英雄联盟-经验砖块

    作为一个LOL老玩家 如果说对游戏细节把握不到位 这是说不过去的 我们时常说道发育为重 那么发育包括等级和装备 我们是不是应该更精细的把我等级呢 今天我们来探究一下 赖线从小兵身上我们能获得多少经验等级 问题1 每个小兵有多少经验值呢 近战
  • 勒索软件攻击防护中的6个常见错误

    勒索软件攻击已经成为影响所有行业和组织的大问题 考虑到这些攻击可能对企业造成的影响 安全专业人员正在尝试以各种方式保护企业的网络 应用和数据 然而 但随着勒索攻击威胁形势的不断变化 很多错误的做法可能会阻碍企业勒索防护计划的有效执行 并使组
  • 最详细的Transformer讲解,Attention Is All You Need

    前言 Attention Is All You Need Google Brain 引用量 30255 1 3 ResNet 贡献 Transformer 是第一个完全依赖自注意力来计算其输入和输出表示而不是使用序列对齐的RNN和CNN 一
  • C++标准库头文件(工具库->csetjmp)

    参考网址 https zh cppreference com w cpp header https www runoob com cplusplus cpp standard library html 工具库 csetjmp 保存执行语境的
  • Android-Fragment详解

    Fragment是Android最常使用的控件之一 一般情况下 我们会在首页使用到 有的小伙伴也会单Activity和多Fragment的App 我总结了一下我了解的Fragment知识 希望对看这篇文章的小伙伴有所帮助 Fragment的
  • USB:Type-A、Type-B、Type-C、miniUSB、microUSB接口类型区分

    通用串行总线 universal serial bus USB 自推出以来 成功替代串口和并口 已经成为计算机和各种设备不可或缺的接口 USB的优点不用多说 网上有很多 今天主要小结一下USB的各种接口类型 避免被各种各样的USB名字搞晕
  • SQL调优案例1

    SQL语句的执行顺序 1 LIMIT 语句 分页查询是最常用的场景之一 但也通常也是最容易出问题的地方 比如对于下面简单的语句 一般 DBA 想到的办法是在 type name create time 字段上加组合索引 这样条件排序都能有效
  • 遥感影像识别-利用较大数据集训练

    回顾 经过前两次的思考 最终还是回到最初的想法上来 利用大量比较合理的电子地图进行模型的训练 看能否产生较好的效果 前两次的博文链接如下 遥感影像识别 制作数据集 遥感影像识别 训练策略 本次训练所使用的数据集 地域覆盖了全国几个主要的城市
  • Elasticsearch入门笔记

    ES入门笔记 1 概述 1 1 什么是全文检索 1 2 es的应用场景 1 3 参考资料 2 核心概念 3 进阶 3 1 集群 3 1 1 单节点 3 1 2 双节点 故障转移 3 1 3 三节点 水平扩容 3 1 4 应对故障 3 2 路
  • jdk1.8 Lambda 实战

    我们用常用的实例来感受 Lambda 带来的便利 替代匿名内部类 过去给方法传动态参数的唯一方法是使用内部类 比如 1 Runnable 接口 new Thread new Runnable Override public void run
  • 【HJ40】统计字符

    题目描述 输入一行字符 分别统计出包含英文字母 空格 数字和其它字符的个数 本题包含多组输入 数据范围 输入的字符串长度满足 1 1000 输入描述 输入一行字符串 可以有空格 输出描述 统计其中英文字符 空格字符 数字字符 其他字符的个数
  • CSS字体

    CSS字体属性定义文本中的字体 指定字体 font family属性 指定在文本中使用的字体系列 如 body font family sans serif 从sans serif字体系列中选择一个字体 并将其应用到body元素中 CSS字
  • 关于idea中提交svn时一直显示performing VCS refresh

    vue前端项目会自动生成node modules文件夹 在首次上传版本到svn的时候 不要提交node modules文件夹 否则node modules文件也会在版本控制中 那么在npm install之后 灾难就来了 Version C
  • 21年新版kali安装

    第一步 官网下载kali系统镜像文件 官网地址 www kali org 访问kali官网 点击上方GET KALI 然后点击Bare Metal 旁边的Virtual Machines是专门为虚拟机设计的 相比更为轻量 安装过程也比较简单

随机推荐

  • 配置Dot1q终结子接口实现跨设备VLAN间通信示例

    示例图 一 实验目的 1 配置Dot1q终结子接口实现跨设备VLAN间通信示例 二 注意事项 1 Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN Tag的报文 收到不带VLAN Tag的报文会直接丢弃 2 由于三层以太网子接
  • 前端传输数组条件查询,myslq使用in

    mysql语句使用in条件查询 从前端获取数组 1 post请求体中的json对象 Data public class UserSearchParam String userName NotNull Integer pageNum NotN
  • maomi

    我到家啦 你今天怎么样 需要我帮忙查资料么 转载于 https www cnblogs com loverain archive 2009 07 02 1515416 html
  • 每日一题:7. 分糖果(C++)

    每日一题 7 分糖果 C 题目 Alice 有 n 枚糖 其中第 i 枚糖的类型为 candyType i Alice 注意到她的体重正在增长 所以前去拜访了一位医生 医生建议 Alice 要少摄入糖分 只吃掉她所有糖的 n 2 即可 n
  • Spring-Data-JPA +Sharding-jdbc+druid数据库连接池 实现数据库读写分离

    关于Sharding jdbc 简介 定位为轻量级Java框架 在Java的JDBC层提供的额外服务 它使用客户端直连数据库 以jar包形式提供服务 无需额外部署和依赖 可理解为增强版的JDBC驱动 完全兼容JDBC和各种ORM框架 适用于
  • JDBC之多种开源数据库连接池介绍

    目录 一 多种开源的数据库连接池 二 C3P0数据库连接池 三 DBCP数据库连接池 四 Druid 德鲁伊 数据库连接池 一 多种开源的数据库连接池 1 JDBC 的数据库连接池使用 javax sql DataSource 来表示 Da
  • Element-ui 使用详细介绍

    一 后台搭建 使用 vue admin template 来快速搭建后台管理 它包含了 Element UI axios iconfont permission control lint 这些搭建后台必要的东西 Element是 饿了么团队
  • 六、Docker安装微服务

    一 编译所有的所需jar包 二 上传到服务器 三 编写Docerfile FROM java 8 ADD registry center 1 0 SNAPSHOT jar registry center 1 0 SNAPSHOT jar E
  • js将数组中,每个元素中的逗号分隔的前两位相同的,第三位拼接到一起

    js重新组合数组中的元素 过程可能复杂了 尽力了 谁有简单的留言一下 互相交流学习一下 感谢 var arr 1 20 103 1 28 66 1 20 456 1 21 22 1 21 13 1 20 23 1 21 55 var cou
  • 从零搭建antv数据可视化大屏(轻量级vite-react-ts)

    摘 要 之前Ofter详细介绍过用Vue从零开始编写可视化大屏 今天我们来介绍下如何用React编写可视化图表 为什么我们还要学习React 因为轻量化 像antv可视化图表就全部用的React语言 虽然ant也出了个viser 支持Rea
  • Chrome 网页翻译扩展推荐

    1 沉浸式翻译 网页双语翻译扩展 免费使用 支持 Deepl Google 腾讯 火山翻译等多个翻译服务 支持 Firefox Chrome 油猴脚本 亦可在 iOS Safari 上使用 官网地址 Chrome 网页翻译扩展推荐 2 划词
  • 查找窗口句柄

    HWND SearchWindow CString strWinName 获得桌面窗口 CWnd pDesktopWnd CWnd GetDesktopWindow 获得第一个子窗口 CWnd pWnd pDesktopWnd gt Get
  • strong man

    1 执行力强 注意力放在面对问题 解决问题而不是抱怨上 2 有利他性 看白身的格局 有大局观 会从更高的维度去思考 有更大的责任感3 从容淡定 有足够的自信 对自己的信任和信念 不需要用力过猛 疲于奔命 4 内在自治 跟自己相处和谐 不自我
  • I like play indoor bicycle trainer

    Kurt kinetic road bicycle training machine is a bicycle trainer I bought for me This is a superb quality very silent and
  • 二进制的神奇应用

    谜题 这是一个在坐标轴上玩的 关于 坐标集合 a1 a2 am b1 b2 bl 的游戏 首先 Bob分别在坐标a1 a2 am放上一个球 接下来Bob分别在坐标b1 0 5 b2 0 5 bl 0 5挖了一个洞 最后Bib会将所有球往前推
  • Python 进阶(五):数据库操作之 SQLite

    1 简介 SQLite 是一种嵌入式关系型数据库 其本质就是一个文件 它占用资源低 处理速度快 跨平台 可与 Python Java 等多种编程语言结合使用 SQLite 是一个进程内的库 可以自给自足 无服务器 无需配置 支持事务 Pyt
  • 百度超详细面经(附答案)

    点击上方蓝字关注我们吧 百度 一面 上来照例还是问了问项目 答 我介绍了自己的项目背景 项目的整个流程 由于是一个多人合作的项目 还介绍了自己负责项目的哪个模块 以及这个模块如何实现的 我感觉我个人说话语速比较快 建议大家尽量语速慢一些 可
  • 阿里P8架构师(花名:霍州)Java程序性能优化“学习日记”

    Java程序性能优化是一门 优化的技术 这门功课值得我们一直去探索 本篇我们会系统的介绍性能的基本概念 两个重要的定律 木桶原理和 Amdahl 定律 以及系统调优的一般过程与注意事项 接下来我们将会学习性能相关的设计模式 组件以及有助于改
  • 折磨我两天的c3p0线程死锁问题终于解决了,其原因竟然是这个!

    折磨我两天的c3p0线程死锁问题终于解决了 其原因竟然是这个 com mchange v2 async ThreadPoolAsynchronousRunner DeadlockDetector 177bb7a APPARENT DEADL
  • Qt网络编程:QNetworkReply

    一 描述 QNetworkReply 类封装了使用 QNetworkAccessManager 发布的请求相关的回复信息 QNetworkReply 是 QIODevice的子类 这意味着一旦从对象中读取数据 它就不再由设备保留 因此 如果