赞
踩
目录
Qt中的HTTP通信访问 API 是围绕 QNetworkAccessManager 对象构建的,该对象保存它发送的请求的通用配置和设置,一个 QNetworkAccessManager 实例应该足以满足整个 Qt 应用程序网络访问的需求。
当 QNetworkAccessManager 对象被创建时,那么 应用程序就可以使用它在网 络上发送请求。它提供了一组标准的函数,可以承载网络请求和一些可选的数据, 并且每一个请求返回一个 QNetworkReply 对象。该返回的对象包含着返回的请求应 带的所有数据。
QNetworkAccessManager 将它收到的请求排入队列。 并行执行的请求数量取决于协议。 目前,对于桌面平台上的 HTTP 协议,一个主机/端口组合并行执行 6 个请求
目前,对于桌面平台的 HTTP 协议,对于一个主机/端口的组合,可 6 个请求并行执 行。
- //头文件
- #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>)));
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, [=](){
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。