- 使用
【1】网络访问接口是一组执行常见网络的类的集合。
【2】该接口在特定的操作和协议(通过HTTP获取和发送数据)上提供了一个抽象层,开发者只需要使用其提供的类、函数和信号即可完成操作,而不需要知道底层是如何实现的。
【3】C++ class
- 网络请求由QNetworkRequest类来表示,它也作为请求相关的信息(例如,任何头信息和使用加密)的容器。在创建请求对象时指定的URL决定请求使用的协议,目前支持HTTP、Ftp和本地文件URL的上传和下载。
- 协调网络操作:QNetworkAccessManager 类 可以调度创建好的请求,并发射信号来报告进度
- 网络请求应答:QNetworkReply 类 ,
- 请求调到完成时由QNetworkAccessManager 类 创建,
QNetworkReply提供的信号可以用来单独监视每一个应答,也可以使用 QNetworkAccessManager信号实现。这样就可以丢弃对应答对象的引用。
因为QNetworkReply 是 QIODevice 的子类 ,应答可以使用同步或者异步的方式来处理,比如阻塞和非阻塞操作。
- 请求方式
HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是get,put,post,delete。
URL(资源描述符),一个URL地址,它用于描述一个网络上的资源。
//【1】查:发布请求以获取目标请求的内容
QNetworkReply * get(const QNetworkRequest &request)
//发布请求以获取请求的网络标头,并返回一个新的QNetworkReply对象,该对象将包含此类标头。
QNetworkReply *head(const QNetworkRequest &request)
//【2】改:向请求指定的目的地发送httpPost请求,将数据设备的内容将上传到服务器
QNetworkReply * post(const QNetworkRequest &request, QIODevice *data)
//【3】增:将数据的内容上传到目标请求,并返回一个新的QNetworkReply对象,该对象将打开以供回复
//对于http,此请求将发送一个PUT请求,大多数服务器不允许
QNetworkReply * put(const QNetworkRequest &request, QIODevice *data)
//【4】删:发送请求以删除由请求的url标识的资源
QNetworkReply *deleteResource(const QNetworkRequest &request)
总结:
【1】http (超文本传输协议) 是一个基于请求与响应模式的,无状态的,应用层的协议,常基于TCP的连接方式
【2】特点:
请求响应模型;请求和响应必须成对;先有请求后有响应;http 默认端口 80
【3】在http 1.0 的三种请求方式:get、post、head、
区别:
get , 通过URL提交数据,有字节限制,一般而言提交的数据至多1024字节。
post ,数据放置在html header 内提交,POST则没有字节限制
head , head请求和get请求类似,但是HEAD并不返回消息体,一个HEAD请求的响应可被缓存.响应中的信息可能用来更新之前缓存的实体。
//参考:https://blog.csdn.net/qq89115156/article/details/98493354?biz_id=102&utm_term=http%E7%9A%84%E5%AE%9A%E4%B9%89&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-6-98493354&spm=1018.2118.3001.4187
- 实践Demo–从网上下载文件(图片)并显示到QLabel上
//MainWindow.h
#include <QMainWindow>
#include<QNetworkAccessManager>
#include<QNetworkReply>
#include<QUrl>
#include<QFile>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void DoneRequest(QUrl url);
private slots:
void on_pushButton_clicked();
void slotReadyread();