Qt 之 QNetworkAccessManager

概述

QT网络访问API是围绕一个QNetworkAccessManager对象构建的,该对象保存它发送的请求的公共配置和设置。它包含代理和缓存配置,以及与此类问题相关的信号,以及可用于监视网络操作进度的回复信号。一个QNetworkAccessManager实例应该足够用于整个Qt应用程序。由于QNetworkAccessManager基于QObject,因此只能从它所属的线程使用它。

一旦创建了QNetworkAccessManager对象,应用程序就可以使用它通过网络发送请求。提供了一组标准函数,它们接受一个请求和可选数据,每个函数返回一个QNetworkReply对象。返回的对象用于获取响应相应请求而返回的任何数据。

基本用法

下面展示一些 简单用法示例

 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
  connect(manager, &QNetworkAccessManager::finished,
          this, &MyClass::replyFinished);

  manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
// An highlighted block
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, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),
          this, &MyClass::slotError);
  connect(reply, &QNetworkReply::sslErrors,
          this, &MyClass::slotSslErrors);

注意事项

在一轮请求完成后,不要立即删除QNetworkReply对象,要用deleteLater()函数让Qt系统自己判断在适当的时候删除;

QNetworkAccessManager类对所接收的请求会一个一个的排序,如果要并行处理这些请求,同时间内处理的数量取决于协议。目前,对HTTP协议是6个请求并行处理的

其他属性

枚举

QNetworkAccessManager::NetworkAccessibility
指示是否可以通过此网络访问管理器访问网络。

QNetworkAccessManager::UnknownAccessibility -1 无法确定网络可访问性。
QNetworkAccessManager::NotAccessible 0 当前无法访问网络,原因可能是当前没有网络覆盖范围,或者通过调用setNetworkAccessible()显式禁用了网络访问。
QNetworkAccessManager::Accessible 1 网络是可访问的。

相关的获取和设置函数为:
NetworkAccessibility networkAccessible() const
void setNetworkAccessible(NetworkAccessibility accessible)

还有一个信号,当网络状态发生改变时:
void networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility accessible)

QNetworkAccessManager::Operation
指示此答复正在处理的操作类型
在这里插入图片描述

属性和API

返回当前活动网络的配置

QNetworkConfiguration activeConfiguration() const
QNetworkConfiguration configuration() const

调用第二个返回的是创建网络会话所需的配置(网络会话是请求的时候用的)。那么第一个呢?当你调用第二个返回的网络配置是QNetworkConfiguration::ServiceNetwork类型,那么调用第二个函数会返回活动的子网络配置,否则调用第一个返回的网络配置和第二个一样。

将严格的HTTP传输安全策略添加到HSTS缓存中

void addStrictTransportSecurityHosts(const QVector &knownHosts)
这是Qt5.9版本引入的新函数。注意:如果以前存在,过期的策略将从缓存中删除一个已知主机。在处理HTTP响应时,QNetworkAccessManager也可以更新HSTS缓存,删除或更新已存在的策略或引入新的主机。当前的实现是由服务器驱动的,客户端代码可以使用以前已知或已发现的策略来提供QNetworkAccessManager,但是这些信息可以被Strict-Transport-Security(严格传输安全)响应头覆盖。

网络上存储数据的缓存

*QAbstractNetworkCache * cache() const
void setCache(QAbstractNetworkCache cache)

假如在一个类上设置个缓存对象,将会得到更多的特性,比如永久存储cookie。默认情况下QNetworkAccessManager类拥有缓存的所有权。Qt提供了一个缓存集QNetworkDiskCache。

刷新身份验证数据和网络连接的缓存

void clearAccessCache()
void clearConnectionCache()
第一个函数全刷了,第二个函数保留身份验证数据。做自动测试比较有用。

连接主机

void connectToHost(const QString &hostName, quint16 port = 80)
void connectToHostEncrypted(const QString &hostName, quint16 port = 443, const QSslConfiguration &sslConfiguration = QSslConfiguration::defaultConfiguration())

用hostName和80端口连接主机。在进行HTTP请求前,该函数用于完成TCP握手。注意:该函数永远都不会报错。第二个函数就是多了个SSL配置。在允许的协议当中,比如拥有QSslConfiguration::NextProtocolSpdy3_0协议的sslConfiguration调用setAllowedNextProtocols()可以提前完成SPDY连接。

返回存储的cookie

QNetworkCookieJar * cookieJar() const

删除URL资源

QNetworkReply * deleteResource(const QNetworkRequest &request)
发送一个请求来删除被标识的URL资源。注意:该特性目前仅用于HTTP,执行HTTP DELETE请求。

发送请求

QNetworkReply * get(const QNetworkRequest &request)
只要有新数据到来,就会发出readyRead()信号!头文件和内容都会被下载。

返回头文件(HEAD)

QNetworkReply * head(const QNetworkRequest &request)

是否启用HSTS

bool isStrictTransportSecurityEnabled() const
void setStrictTransportSecurityEnabled(bool enabled)
HSTS:HTTP严格的传输协议。

上传数据

QNetworkReply * post(const QNetworkRequest &request, QIODevice *data) QNetworkReply * post(const QNetworkRequest &request, const QByteArray &data) QNetworkReply * post(const QNetworkRequest &request, QHttpMultiPart *multiPart)
QNetworkReply * put(const QNetworkRequest &request, QIODevice *data) QNetworkReply * put(const QNetworkRequest &request, const QByteArray &data) QNetworkReply * put(const QNetworkRequest &request, QHttpMultiPart *multiPart)
发送HTTP POST请求,data必须可以打开有效,直到这个reply发出finished()信号。注意:在HTTP和HTTPS之外的协议上发送POST请求是未定义的,很可能会失败。

第三个函数可以发送MIME信息。

post和put的区别,大部分情况用post,很少用put。其实就是个规范语义,两者没什么太大区别,看服务器怎么处理了。

代理

QNetworkProxy proxy() const
QNetworkProxyFactory * proxyFactory() const
默认的代理为QNetworkProxy::DefaultProxy。第二个函数返回代理工厂,manager对象使用去终止曾经请求中使用了的代理。注意:这个函数返回的指针是被QNetworkAccessManager管理着,并且可以在任何时候被删除。

重定向策略

QNetworkRequest::RedirectPolicy redirectPolicy() const
void setRedirectPolicy(QNetworkRequest::RedirectPolicy policy)

自定义请求

QNetworkReply * sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = Q_NULLPTR)
QNetworkReply * sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, const QByteArray &data)
QNetworkReply * sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QHttpMultiPart *multiPart)
上面的get(),post()等都是常用的,该函数可以发送自定义请求,例如HTTP OPTION语法。

HSTS列表

QVector strictTransportSecurityHosts() const

支持的协议

QStringList supportedSchemes() const

信号

void authenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator)
void encrypted(QNetworkReply *reply)
void finished(QNetworkReply *reply)
void networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility accessible)
void preSharedKeyAuthenticationRequired(QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator)
void proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)
void sslErrors(QNetworkReply *reply, const QList &errors)

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值