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的更多相关文章

  1. Qt使用QNetworkAccessManager实现Ftp操作

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt使用QNetworkAccessManager实现Ftp操作     本文地址:http: ...

  2. Qt使用QNetworkAccessManager实现Http操作

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt使用QNetworkAccessManager实现Http操作     本文地址:http ...

  3. Qt:禁止qDebug的输出

    Qt:禁止qDebug的输出 在工程的.pro文件里加上以下编译批令即可: DEFINES += QT_NO_DEBUG_OUTPUT

  4. Qt:使用自定义的字体

    Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体   QFontDatabase::addApplicationFont("XENOTRON.TTF" ...

  5. Qt:QJsonObject

    0.说明 QJsonObject在逻辑上就是一个Map或Dict!记住这一点对理解它的方法.说明很有帮助. QJsonObject类封装了JSON Object. JSON Object是一个Key- ...

  6. Qt:QJsonValue

    0.说明 QJsonValue类用于操作JSON中的各种数据. JSON是用于存储结构化数据的格式,JSON中的数据可以是六种类型: 基本类型 存储类型 bool QJsonValue::Bool d ...

  7. Qt:QJsonArray

    0.说明 QJsonArray中存储了一系列的QJsonValue.可以向其中插入.删除QJsonValue. 一个QJsonArray可以与QVariantList互相转换.可以通过size()访问 ...

  8. Qt:QUrl构造时的qrc前缀

    参考(按对我帮助从大到小排列): Qt内的各种路径(让人迷惑) - 鬼谷子com - 博客园 qt webengineview 加载本地资源方式 - beautifulday - 博客园 (17条消息 ...

  9. QT:多线程HTTP下载文件

    这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器 ...

随机推荐

  1. liunx查看哪个ip连接最多

    [root@centos6 /]# netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|so ...

  2. makefile快速入门

    前言 在linux上开发c/c++代码,基本都会使用make和makefile作为编译工具.我们也可以选择cmake或qmake来代替,不过它们只负责生成makefile,最终用来进行编译的依然是ma ...

  3. python办公自动化系列之金蝶K3自动登录(一)

    做办公自动化的小伙伴都知道,驱动SAP GUI我们有SAP原生提供的[脚本录制与回放]以及SAP Scripting API可参考:驱动Office Excel等,我们有微软提供的[录制宏]功能:驱动 ...

  4. VMware网络连接模式(桥接、NAT以及仅主机模式的详细介绍和区别)

    VMware 桥接模式 VMware桥接模式,也就是将虚拟机的虚拟网络适配器与主机的物理网络适配器进行交接,虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器直接访问到外部网络(例如图中所示的局域网 ...

  5. Web标准和骨架

    Web 标准的好处 1.让Web的发展前景更广阔 2.内容能被更广泛的设备访问 3.更容易被搜寻引擎搜索 4.降低网站流量费用 5.使网站更易于维护 6.提高页面浏览速度 Web 标准构成 Web标准 ...

  6. Python—经典练手题目汇总

    Python-经典练手题目汇总 # 1.有1020个西瓜,第一天卖掉总数的一半后又多卖出两个,以后每天卖剩下的一半多两# 个,问几天以后能卖完? day=0 xg=1020 for i in rang ...

  7. python——rsa加签名以及分段加密

    借鉴 https://www.cnblogs.com/sammy1989/p/9583965.html 最近请求一个系统,对方要求加密.折腾了一天,使用pycryptodome库,最终代码如下: #! ...

  8. SpringMVC5中,@ModelAttribute注解详解

    看这个注解的前提最好熟悉一下SpringMVC的model组件,该注解可以有五种使用方式: ①②③为 @ModelAttribute 跟@RequestMapping 分开修饰方法,被@ModelAt ...

  9. Diary -「CSP 2019 J/S」 游记

    \(\text{Day 0}\) 试机, 总体感觉不错, 至少不像初一时候的紧张, 毕竟是中青年选手了 ( ? )         当晚睡得挺好, 虽然是冲着一等奖去的, 但还是没有给自己过多的思想包 ...

  10. 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式

    在之前的系列文章中聊过分布式事务的一种实现方案,即通过在集群中暴露actor服务来实现分布式事务的本地原子化.但是actor服务本身有其特殊性,场景上并不通用.所以今天来讲讲分布式事务实现方案之sag ...