Qt扫盲-QNetworkReply理论总结

本文介绍了Qt中QNetworkReply类处理Http请求结果的相关内容。QNetworkReply包含请求回来的数据和元数据,与Http协议返回结果一致。它是顺序访问的QIODevice,接收数据时会触发相关信号。还说明了其使用方法,包括读取body内容、获取head属性值及错误处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

QNetworkReply类包含了与QNetworkAccessManager发送的请求回来的相关的数据和元数据。与QNetworkRequest类似,它包含一个URL和头部(包括解析的和原始的形式),一些关于应答状态的信息和应答本身的内容。

这个类的结果本质上和 http 协议的返回结果一致的。Http 协议的话很像下面的这个图
在这里插入图片描述
简单来看其实就是下面这个图
在这里插入图片描述

QNetworkReply是一个顺序访问的QIODevice,这意味着数据一旦从对象中读取,就不再由设备保存。因此,如果需要,保存这些数据是应用程序的责任。每当从网络接收并处理更多数据时,就会发出 readyRead() 信号。

在接收数据时也会触发 downloadProgress() 信号,但如果对内容进行了任何转换(例如解压缩和移除协议开销),其中包含的字节数可能并不代表实际接收到的字节数。

虽然 QNetworkReply 是一个连接到回复内容的 QIODevice,但它也会发出 uploadProgress() 信号,用于指示包含此类内容的操作的上传进度。

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

二、使用

1. 读取body内容

因为QNetworkReply 是继承至 QIODevice ,所有在服务器发送数据到本地的时候,也就是 接收到 readyRead() 信号,我们就可以在 这个信号对应的槽函数里,调用 比如 read() , readAll() 等函数,来读取接收到的数据。

给一个简单的例子就清楚流程了。

QNetworkAccessManager *manager = new QNetworkAccessManager(this);

//这个是请求发起成功
connect(manager, &QNetworkAccessManager::finished,
          this, &MyClass::replyFinished);

manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

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, [=]{
		qDebug()<<reply->readAll();
	});

//错误处理
connect(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
          this, &MyClass::slotError);
connect(reply, &QNetworkReply::sslErrors,
          this, &MyClass::slotSslErrors);

2. 获取head属性值

我们通过下面的这些API 就能够获取到 这个是谁发送的 QNetWorkAccessManger 对象,可以获取到 这些 这个请求的 具体内容,这个 url 也能获取到,以及在 Header 设置的内容。
在这里插入图片描述

3. 错误处理

在错误信号发生的时候,就可以使用,如下的方式来处理

  connect(networkReply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
      [=](QNetworkReply::NetworkError code){ 
      /*这里可以通过 code 知道哪里错了*/
      
       });
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳风暴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值