概述
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)