Qt扫盲-QNetworkReply理论总结

一、概述

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 知道哪里错了*/
      
       });

猜你喜欢

转载自blog.csdn.net/qq_43680827/article/details/128765815#comments_27864407
今日推荐