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

目录

基本概念

1.QNetworkAccessManager

常用的公共成员函数

信号 

2.QNetworkRequest ——HTTP请求

3.QNetworkReply——HTTP响应

HTTP通信流程

基本概念

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

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

扫描二维码关注公众号,回复: 17036150 查看本文章

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

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

1.QNetworkAccessManager

常用的公共成员函数

//头文件
#include <QNetworkAccessManager>

//构造函数
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<QSslError>)), this, SLOT(slotSslErrors(QList<QSslError>)));

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

        

猜你喜欢

转载自blog.csdn.net/sjp11/article/details/131629329