目录
基本概念
1.QNetworkAccessManager
常用的公共成员函数
信号
2.QNetworkRequest ——HTTP请求
3.QNetworkReply——HTTP响应
HTTP通信流程
Qt中的HTTP通信访问 API 是围绕 QNetworkAccessManager 对象构建的,该对象保存它发送的请求的通用配置和设置,一个 QNetworkAccessManager 实例应该足以满足整个 Qt 应用程序网络访问的需求。
当 QNetworkAccessManager 对象被创建时,那么 应用程序就可以使用它在网 络上发送请求。它提供了一组标准的函数,可以承载网络请求和一些可选的数据, 并且每一个请求返回一个 QNetworkReply 对象。该返回的对象包含着返回的请求应 带的所有数据。
QNetworkAccessManager 将它收到的请求排入队列。 并行执行的请求数量取决于协议。 目前,对于桌面平台上的 HTTP 协议,一个主机/端口组合并行执行 6 个请求
目前,对于桌面平台的 HTTP 协议,对于一个主机/端口的组合,可 6 个请求并行执 行。
//头文件
#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)));
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)
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)
模板:
//举例;
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, [=](){
}