【QT】——QT中HTTP通信的使用流程

目录

基本概念

1.QNetworkAccessManager

常用的公共成员函数

信号 

2.QNetworkRequest ——HTTP请求

3.QNetworkReply——HTTP响应

HTTP通信流程

基本概念

Qt中的HTTP通信访问 API 是围绕 QNetworkAccessManager 对象构建的,该对象保存它发送的请求的通用配置和设置,一个 QNetworkAccessManager 实例应该足以满足整个 Qt 应用程序网络访问的需求。

QNetworkAccessManager 对象被创建时,那么 应用程序就可以使用它在网 络上发送请求。它提供了一组标准的函数,可以承载网络请求和一些可选的数据 并且每一个请求返回一个 QNetworkReply 对象。该返回的对象包含着返回的请求应 带的所有数据。

QNetworkAccessManager 将它收到的请求排入队列。 并行执行的请求数量取决于协议。 目前,对于桌面平台上的 HTTP 协议,一个主机/端口组合并行执行 6 个请求

目前,对于桌面平台的 HTTP 协议,对于一个主机/端口的组合,可 6 个请求并行执 行。

1.QNetworkAccessManager

常用的公共成员函数

//头文件
#include 

//构造函数
QNetworkAccessManager(QObject *parent = nullptr)


//发布get请求以获取内容,
//返回一个新的 QNetworkReply 对象,该对象在新数据到达时发出 readyRead() 信号。
QNetworkReply * get(const QNetworkRequest &request)

//发送post请求
QNetworkReply* post(const QNetworkRequest &request, QIODevice *data)
QNetworkReply* post(const QNetworkRequest &request, const QByteArray &data)
QNetworkReply* post(const QNetworkRequest &request, QHttpMultiPart *multiPart)

//返回cookies
QNetworkCookieJar * cookieJar() const

//刷新网络连接的内部缓存。与 clearAccessCache() 相比,身份验证数据被保留。
void clearConnectionCache()

//与指定主机进行连接
void connectToHost(const QString &hostName, quint16 port = 80)

//设置传输超时时间。如果在超时到期之前没有传输字节,传输将被中止。
//零表示未设置计时器。如果未调用此函数,则超时将被禁用且值为 0。
void setTransferTimeout(int timeout = QNetworkRequest::DefaultTransferTimeoutConstant)

信号 

//信号 
//当有请求已经完成的时候,会发射该信号
void finished(QNetworkReply *reply)

//当 SSL/TLS 会话成功完成初始握手时,会发出此信号。此时,还没有传输用户数据。
[signal] void encrypted(QNetworkReply *reply)

//网络回复完成时会发出此信号。回复参数将包含一个指向刚刚完成的回复的指针。该信号与 //QNetworkReply::finished() 信号一起发出。
//注意:不要直接删除连接到该信号的槽中的回复对象。应使用 deleteLater()
[signal] void finished(QNetworkReply *reply)

注意:QNetworkAccessManager类对所接收的请求会一个一个的排序,如果要并行处理这些请求,同时间内处理的数量取决于协议。目前,对HTTP协议是6个请求并行处理的。

//创建个请求对象,设置好请求的内容
QNetworkRequest request;
request.setUrl(QUrl("http://qt-project.org")); 
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0"); 

//应答对象reply,不仅获得下载数据,还获得失败时的错误信息
QNetworkReply *reply = manager->get(request); 
connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); 
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); 
connect(reply, SIGNAL(sslErrors(QList)), this, SLOT(slotSslErrors(QList)));

2.QNetworkRequest ——HTTP请求

QNetworkRequest是QT中的HTTP请求对象,它包含请求的url和请求报头,正文等信息。


//构造函数
QNetworkRequest(const QUrl &url = QUrl())
QNetworkRequest(const QNetworkRequest &other)

//设置QNetworkAccessManager 用于此请求及其底层 HTTP/2 连接的参数。
void setHttp2Configuration(const QHttp2Configuration &configuration)

//返回在此网络请求中设置的所有报头的列表。按照设置顺序排列
QList rawHeaderList()

//设置此网络请求所指的 URL 为 url。
void setUrl(const QUrl &url)

//设置表头的值。两次设置相同的标题会覆盖之前的设置
void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue)

3.QNetworkReply——HTTP响应

QNetworkReply是HTTP响应类,QNetworkReply对象包含了响应的数据和响应头

注意:在一轮请求完成后,不要立即删除QNetworkReply对象,要用deleteLater()函数让Qt系统自己判断在适当的时候删除。

接口函数:

//QNetworkReply被处理完成则返回true
bool  isFinished() const

//如果请求还在进行,或者响应处理还没有完成,或者响应已经被终止,则返回true
bool  isRunning() const

//返回上传或者下载的url,该 URL 可能与原始请求的 URL 不同。
QUrl QNetworkReply::url() const

//返回该响应对应的请求
QNetworkRequest request() const

//返回读缓冲区的大小
qint64 readBufferSize() const

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

//信号
//当x响应完成处理后发出此信号。发出此信号后,将不再更新回复的数据。
//除非调用 close() 或 abort() ,否则仍将打开回复以供读取.
//因此可以通过调用 read() 或 readAll() 来检索数
void finished()


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

//发出此信号以指示此网络请求的下载部分的进度(如果有下载)
//如果没有与此请求关联的下载,则此信号将发出一次,bytesReceived 和 bytesTotal 的值都为0。
//bytesReceived 指示接收的字节数,bytesTotal 指示预期下载的总字节数
//如果要下载的字节数未知,bytesTotal 将为 -1
[signal] void downloadProgress(qint64 bytesReceived, qint64 bytesTotal)

//出现错误时发出此信号。代码参数包含检测到的错误代码。
//调用 errorString() 以获取错误条件的文本表示。
[signal] void errorOccurred(QNetworkReply::NetworkError code)

HTTP通信流程

  1. 创建QNetworkAccessManager 对象。
  2. 创建 QNetworkRequest 对象,调用setUrl函数 设置请求url,调用setHeader函数设置请求报头。
  3. 调用QNetworkAccessManager 调用post函数或者get函数发送HTTP请求
  4. 设置槽函数,并调用connect函数设置QNetworkReply的处理动作

模板:


//举例;
QNetworkAccessManager* manger=new QNetworkAccessManager(this);
QNetworkRequest request; 
request.setUrl(url);
//设置需要设置响应报头
request.setHeader(QNetworkRequest::ContentTypeHeader,
                   QVariant("application/json"));

//发送请求
QNetworkReply *reply = manager->post(request);
//或者
//data数据的处理流程
QNetworkReply *reply = manager->post(request, data);

//设置http响应的处理动作
connect(reply, &QNetworkReply::readyRead, this, [=](){
}

        

你可能感兴趣的:(QT笔记,http,网络协议,网络)