QNetworkReply理论总结
- 一、概述
- 二、使用
- 1. 读取body内容
- 2. 获取head属性值
- 3. 错误处理
一、概述
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 知道哪里错了*/
});