Qt:QNetworkAccessManager
0、说明
QNetworkAccessManager允许应用发送Request并接受回应。
网络访问API是围绕一个QNetworkAccessManager对象构建的,该对象保留了所有它发送的请求的配置和设置项。其中包含代理、cache配置、相关的信号、监控网络运行的回应信号。
一个QNetworkAccessManager实例对于整个Qt应用已经足够了。因为QNetworkAccessManager是基于QObject构建的,它只能被它所属的线程使用。
一旦一个QNetworkAccessManager对象被构造了,应用程序就会用它发送Request。之后会收到一个QNetworkReply对象作为响应,该对象包含了该Request对应的Response中所有的数据。
一个简单的网络下载代码如下:
QNetworkAccessManager * manager = new QNetworkAccessManager(this);
connect(manager,&QNetworkAccessManager::finished,this,&MyClass::replyFinished);
manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
QNetworkAccessManager有一个异步API。本例中调用了replyFinished槽,这个槽函数接收一个QNetworkReply作为参数,该参数包含了下载数据。
注意
Request完成后,我们需要在适当时间删除QNetworkReply对象,不要直接在与信号finished()关联的槽函数直接删除这个Request,我们可以用deleteLater()函数。
QNetworkAccessManager会给它收到的Requests设置一个队列。Request数取决于具体协议。现在,对于一个桌面平台上的HTTP协议,对于同一个Host/Port组合并行执行6个requests。
一个更常见的例子,假设Manager已经存在了,那么:
QNetworkRequest request;
request.setUrl(QUrl("http://qt-project.org"));
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");
QNetworkReply *reply = manager->get(request);
connect(reply, &QIODevice::readyRead, this, &MyClass::slotReadyRead);
connect(reply, &QNetworkReply::errorOccurred,this, &MyClass::slotError);
connect(reply, &QNetworkReply::sslErrors,this, &MyClass::slotSslErrors);
1、模块和加载项
| Header: | #include <QNetworkAccessManager> |
| qmake: | QT += network |
| Since: | Qt 4.4 |
| Inherits: | QObject |
2、构造
| QNetworkAccessManager(QObject *parent = nullptr) | 构造一个Manager用于当前网络访问API的核心,并设置它所属的Parent Widget |
3、静态字段
类型 |
字段 |
取值 |
说明 |
| enum | Operation |
{ HeadOperation, GetOperation, PutOperation, PostOperation, DeleteOperation, CustomOperation } |
标识该响应处理的是哪种操作 |
| Constant | Value | Description |
|---|---|---|
QNetworkAccessManager::HeadOperation |
1 |
retrieve headers operation (created with head()) |
QNetworkAccessManager::GetOperation |
2 |
retrieve headers and download contents (created with get()) |
QNetworkAccessManager::PutOperation |
3 |
upload contents operation (created with put()) |
QNetworkAccessManager::PostOperation |
4 |
send the contents of an HTML form for processing via HTTP POST (created with post()) |
QNetworkAccessManager::DeleteOperation |
5 |
delete contents operation (created with deleteResource()) |
QNetworkAccessManager::CustomOperation |
6 |
custom operation (created with sendCustomRequest()) |
4、实例方法
返回值类型 |
方法 |
说明 |
| void | addStrictTransportSecurityHosts(QVector<QHstsPolicy> knownHosts) | 在HSTS cache中添加HTTP传输加密策略。 |
| bool | autoDeleteReplies() | 如果当前Manager会自动删除Reply,返回true |
| QAbstractNetworkCache * | cache() | 返回该Network的cache |
| void | clearAccessCache() |
清空有关认证数据和网络连接的缓冲区。 在进行自动测试时很有用。 |
| void | clearConnectionCache() | 清空有关网络连接的缓冲区,但是认证数据会被保留 |
| void | connectToHost(QString hostName, quint16 port = 80) |
初始化到给定Host的连接。 常用于在HTTP请求前,完成一个到Host的TCP握手。 该方法不会报错。 |
| void |
connectToHostEncrypted(QString hostName, quint16 port = 443, QSslConfiguration sslConfiguration = QSslConfiguration::defaultConfiguration()) connectToHostEncrypted(QString hostName, quint16 port, QSslConfiguration sslConfiguration, QString peerName) |
采用SSL配置连接到给定Host和Port。常用于在HTTPS请求前完成到一个Host的TCP和SSL握手。 |
| QNetworkCookieJar * | cookieJar() | 返回存储cookie的CookieJar |
| QNetworkReply * | deleteResource(QNetworkRequest request) |
发送Request来删除请求该URL的相关资源。 只用于HTTP协议,代表一个HTTP DELETE请求。 |
| void | enableStrictTransportSecurityStore(bool enabled, QString storeDir = QString()) | |
| QNetworkReply * | get(QNetworkRequest request) | 发送get请求,返回Reply。 |
| QNetworkReply * | head(QNetworkRequest request) | 发送一个请求header的Request,返回的Reply将包含这些header。 |
| bool | isStrictTransportSecurityEnabled() | 如果启动HSTS,则返回true |
| bool | isStrictTransportSecurityStoreEnabled() | 如果HSTS cache永久存储HSTS协议,就返回true |
| QNetworkReply * |
post(QNetworkRequest request, QIODevice *data) post(QNetworkRequest request, QByteArray data) post(QNetworkRequest request, QHttpMultiPart *multiPart) |
发送HTTP Post请求。 |
| QNetworkProxy | proxy() | 返回该Manager发送Request时用的代理 |
| QNetworkProxyFactory * | proxyFactory() | 代理因素 |
| QNetworkReply * |
put(QNetworkRequest request, QIODevice *data) put(QNetworkRequest request, QByteArray data) put(QNetworkRequest request, QHttpMultiPart *multiPart) |
发送HTTP Put请求。 |
| QNetworkRequest::RedirectPolicy | redirectPolicy() | 重定向策略。 |
| void |
sendCustomRequest(QNetworkRequest request, QByteArray verb, QIODevice *data = nullptr) sendCustomRequest(QNetworkRequest request, QByteArray verb, QByteArray data) sendCustomRequest(QNetworkRequest request, QByteArray verb, QHttpMultiPart *multiPart) |
发送Reuqest。 |
| void |
setAutoDeleteReplies(bool shouldAutoDelete) setCache(QAbstractNetworkCache *cache) setCookieJar(QNetworkCookieJar *cookieJar) setProxy(QNetworkProxy proxy) setProxyFactory(QNetworkProxyFactory *factory) setRedirectPolicy(QNetworkRequest::RedirectPolicy policy) setStrictTransportSecurityEnabled(bool enabled) setTransferTimeout(int timeout = QNetworkRequest::DefaultTransferTimeoutConstant) |
一些设置项 |
| QVector<QHstsPolicy> | strictTransportSecurityHosts() | 返回HSTS协议列表 |
| QStringList | supportedSchemes() | 列出Manager支持的全部URL模式。 |
| int | transferTimeout() | 传输超时时间。 |
5、信号
信号 |
说明 |
| authenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator) | 当一个Request发送前如果需要认证就发射该信号。槽函数中需要完成对认证信息的填充。 |
| encrypted(QNetworkReply *reply) | 当SSL/TLS会话顺利完成第一次握手后发送该信号。 |
| finished(QNetworkReply *reply) | 当发送Request并收到Reply时发送该信号。 |
| preSharedKeyAuthenticationRequired(QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator) | |
| proxyAuthenticationRequired(QNetworkProxy proxy, QAuthenticator *authenticator) | |
| sslErrors(QNetworkReply *reply, QList<QSslError> errors) |
6、一些简写
| HSTS | HTTP Strict Transport Security | 严格传输安全协议 |
7、常用
1)构造Request请求,由Manager以Get方式发送该请求,收到Reply后处理:
由于会发送请求,收到Reply时会发送&QNetworkRequest::finished()信号,所以把该信号与某个槽函数关联,这样发送请求并收到Reply后可以在该槽函数中说明如何处理Reply。
QNetworkRequest request;//构造空Request
request.setUrl(QUrl("url_string"));//设置该Request欲请求的URL //构造Manager,用于发送Request,构造时必须指定参数Parent
//即它所属的父Widget,比如一个Widget或一个Dialog
QNetworkAccessManager * manager = new QNetworkAccessManager(this); //发送GET请求,并收到了reply之后,Manager会发送finished信号
//将这个信号与某个槽连接,以处理它的reply
manager.get(request); connect(manager,&NetworkAccessManager::finished(),[=](QNetworkReply * reply){
if(reply && reply->error()==QNetworkReply::NoError){
//reply是QIODevice的子类,所以可以用QIODevice的各种读取函数
QByteArray data = reply->readAll();//一次读取全部,写为二进制数据
//...对data的后续处理
}
});
Qt:QNetworkAccessManager的更多相关文章
- Qt使用QNetworkAccessManager实现Ftp操作
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt使用QNetworkAccessManager实现Ftp操作 本文地址:http: ...
- Qt使用QNetworkAccessManager实现Http操作
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt使用QNetworkAccessManager实现Http操作 本文地址:http ...
- Qt:禁止qDebug的输出
Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT
- Qt:使用自定义的字体
Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体 QFontDatabase::addApplicationFont("XENOTRON.TTF" ...
- Qt:QJsonObject
0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...
- Qt:QJsonValue
0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...
- Qt:QJsonArray
0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...
- Qt:QUrl构造时的qrc前缀
参考(按对我帮助从大到小排列): Qt内的各种路径(让人迷惑) - 鬼谷子com - 博客园 qt webengineview 加载本地资源方式 - beautifulday - 博客园 (17条消息 ...
- QT:多线程HTTP下载文件
这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器 ...
随机推荐
- IEEE754浮点数表示法
IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985)是一套规定如何用二进制表示浮点数的标准.就像"补码规则"建立了二进制位和正负数的一一对应关系一样,IEE ...
- 一个简单的javaweb项目模板
Controller包:表现层(视图)层.用来显示数据和接收用户数据 Service包:业务逻辑层,用来处理页面.先写接口,后写实现类 Dao包:持久层(数据访问层).用来操作数据库 其中Dao包处于 ...
- HTTPS加密证书流程(2)
目录 一:HTTPS加密证书流程 二:证书对比 三:自签证书 1.(lb服务器负载均衡代理) 2.(创建CA证书 创建密码) 3.生成自签证书(公钥),同时去掉私钥的密码(Enter) 四:证书内容解 ...
- python利用正则表达式提取文本中特定内容
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python ...
- 学习MyBatis必知必会(7)~注解开发、动态SQL
一.MyBatis的注解开发 开发中推荐是使用xml文件配置 1.配置映射关系[使用注解的方式]: <!-- 全局的配置文件 --> <configuration> <! ...
- C语言中数组长度不能用变量定义吗?
C语言里,所有变量空间都是在程序运行之初向系统申请的,包括指针,除了一些动态申请方式如malloc函数.没有申请的空间系统是不允许读写的.那么如果一个数组大小是变量定义,则在程序运行前不能确定数组大小 ...
- Ext原码学习之lang-Array.js
// JavaScript Document //Array 方法 (function(){ var arrayPrototype = Array.prototype, slice = arrayPr ...
- k8s之list-watch机制、节点调度以及亲和性
k8s之list-watch机制.节点调度以及亲和性 目录 k8s之list-watch机制.节点调度以及亲和性 一.list-watch机制 1. list-watch介绍 2. list-watc ...
- 《手把手教你》系列技巧篇(六十六)-java+ selenium自动化测试 - 读写excel文件 - 上篇(详细教程)
1.简介 在自动化测试,有些我们的测试数据是放到excel文件中,尤其是在做数据驱动测试的时候,所以需要懂得如何操作获取excel内的内容.由于java不像python那样有直接操作Excle文件的类 ...
- socket 套接字编程
今日内容 socket 套接字编程 简易服务端与客户端代码实现 通信循环 黏包现象(TCP协议) 报头制作.struct 模块.封装形式 内容详细 一.socket 套接字编程 实现一款能够进行数据交 ...