Roson的Qt之旅 #118 QNetworkAccessManager详细介绍

235 篇文章 188 订阅

CSDN话题挑战赛第2期
参赛话题:Qt应用程序开发

1.详细描述

QNetworkAccessManager类允许应用程序发送网络请求和接收回复
网络访问API是围绕一个QNetworkAccessManager对象构建的,该对象持有其发送的请求的通用配置和设置。它包含了代理和缓存配置,以及与此类问题相关的信号,还有可用于监控网络操作进展的回复信号。一个QNetworkAccessManager对于整个Qt应用程序来说应该是足够了。
一旦一个QNetworkAccessManager对象被创建,应用程序就可以用它在网络上发送请求。我们提供了一组标准函数,这些函数接收一个请求和可选的数据,并分别返回一个QNetworkReply对象。返回的对象用于获取响应相应请求而返回的任何数据。
一个简单的网络下载可以通过以下方式完成:

  QNetworkAccessManager *manager = new QNetworkAccessManager(this);
  connect(manager, SIGNAL(finished(QNetworkReply*)),
          this, SLOT(replyFinished(QNetworkReply*)));

  manager->get(QNetworkRequest(QUrl("http://qt-project.org")));

QNetworkAccessManager有一个异步的API。当上面的replyFinished槽被调用时,它接收的参数是QNetworkReply对象,包含了下载的数据以及元数据(头文件等)。

注意:请求完成后,用户有责任在适当的时候删除QNetworkReply对象。不要直接在连接到 finished()的槽内删除它。你可以使用deleteLater()函数。

注意:QNetworkAccessManager对其收到的请求进行排队。并行执行的请求的数量取决于协议。目前,对于桌面平台上的HTTP协议,一个主机/端口组合有6个请求被并行执行。

假设管理器已经存在,一个更复杂的例子可以是:

  QNetworkRequest request;
  request.setUrl(QUrl("http://qt-project.org"));
  request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

  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>)));


 
2.网络和漫游支持

随着Qt 4.7增加了承载管理API,QNetworkAccessManager获得了管理网络连接的能力。如果设备处于离线状态,QNetworkAccessManager可以启动网络接口,如果当前进程是最后一个使用上行链路的进程,则可以终止该接口。请注意,一些平台利用宽限期,从最后一个应用程序停止使用上行链路,直到系统实际终止连接链路。漫游同样是透明的。任何排队/等待的网络请求都会自动转移到新的接入点。

想要利用这一功能的客户不需要做任何改变。事实上,很可能现有的平台特定连接代码可以简单地从应用程序中删除。

注意:QNetworkAccessManager中的网络和漫游支持是以支持连接管理的平台为条件的。QNetworkConfigurationManager::NetworkSessionRequired可以用来检测QNetworkAccessManager是否利用这一功能。

也请参见QNetworkRequest, QNetworkReply, 和QNetworkProxy。

3.成员类型说明

enum QNetworkAccessManager::NetworkAccessibility
表示该网络是否可以通过该网络访问管理器访问。

ConstantValueDescription
QNetworkAccessManager::UnknownAccessibility-1无法确定网络的可访问性。
QNetworkAccessManager::NotAccessible0网络目前无法访问,这是因为目前没有网络覆盖,或者网络访问已被调用setNetworkAccessible()明确禁止。
QNetworkAccessManager::Accessible1该网络是可访问的。

参见networkAccessible.

enum QNetworkAccessManager::Operation
表示该回复正在处理的操作。

ConstantValueDescription
QNetworkAccessManager::HeadOperation1检索标题操作(用head()创建)。
QNetworkAccessManager::GetOperation2检索标题和下载内容(用get()创建)
QNetworkAccessManager::PutOperation3上传内容操作(用put()创建)。
QNetworkAccessManager::PostOperation4通过HTTP POST发送HTML表单的内容进行处理(用post()创建)。
QNetworkAccessManager::DeleteOperation5删除内容操作(用deleteResource()创建)
QNetworkAccessManager::CustomOperation6自定义操作(用sendCustomRequest()创建)。

参见QNetworkReply::operation().


3.1属性说明

networkAccessible : NetworkAccessibility

此属性持有该网络当前是否可通过此网络访问管理器访问。
如果网络不可访问,网络访问管理器将不处理任何新的网络请求,所有这类请求将以错误方式失败。带有file://方案的URL的请求仍将被处理。
默认情况下,该属性的值反映了设备的物理状态。应用程序可以覆盖它,通过这个网络访问管理器禁用所有网络请求,方法是调用

  networkAccessManager->setNetworkAccessible(QNetworkAccessManager::NotAccessible);

网络请求可以再次被重新启用,这个属性将恢复反映实际的设备状态,方法是调用

  networkAccessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);

注意:调用setNetworkAccessible()并不改变网络状态。

访问函数:
NetworkAccessibility networkAccessible() const
void setNetworkAccessible(NetworkAccessibility accessible)

信号:
void 
networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility accessible)


3.2成员函数说明

QNetworkAccessManager::QNetworkAccessManager(QObject *parent = Q_NULLPTR)

构建一个QNetworkAccessManager对象,它是网络访问API的中心,并将parent设置为父对象。

QNetworkAccessManager::~QNetworkAccessManager()

销毁QNetworkAccessManager对象并释放所有资源。请注意,从该类返回的QNetworkReply对象被设置为它们的父对象,这意味着如果你不对它们调用QObject::setParent(),它们将与它一起被删除。

void QNetworkAccessManager::addStrictTransportSecurityHosts(const QVector<QHstsPolicy> &knownHosts)

将HTTP严格传输安全策略添加到HSTS缓存中。
注意:一个过期的策略将从缓存中删除已知的主机,如果以前存在的话。
注意:在处理HTTP响应时,QNetworkAccessManager也可以更新HSTS缓存,删除或更新退出的策略或引入新的 knownHosts。因此,目前的实现是由服务器驱动的,客户端代码可以向QNetworkAccessManager提供先前已知或发现的策略,但这些信息可以被 "Strict-Transport-Security "响应头所覆盖。
这个函数是在Qt 5.9中引入的。
参见addStrictTransportSecurityHosts()和QHstsPolicy。

[信号] void QNetworkAccessManager::authenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator)

每当一个最终的服务器在传递所请求的内容之前要求认证时,这个信号就会被发出。连接到这个信号的槽应该在认证器对象中填写内容的凭证(可以通过检查回复对象来确定)。
QNetworkAccessManager将在内部缓存凭证,如果服务器再次要求认证,将发送相同的值,而不发出authenticationRequired()信号。如果它拒绝了证书,这个信号将被再次发出。
注意:要让请求不发送证书,你必须不在认证器对象上调用setUser()或setPassword()。这将导致finished()信号与一个带有AuthenticationRequiredError错误的QNetworkReply一起被发射出来。
注意:不可能使用QueuedConnection来连接这个信号,因为如果在信号返回时,认证器还没有被填入新的信息,连接就会失败。
另请参见proxyAuthenticationRequired(), QAuthenticator::setUser(), 和QAuthenticator::setPassword()。

QAbstractNetworkCache *QNetworkAccessManager::cache() const

返回用于存储从网络中获得的数据的缓存。
这个函数在Qt 4.5中引入。
也请参见setCache()。

void QNetworkAccessManager::clearAccessCache()

冲洗认证数据和网络连接的内部缓存。
这个函数对做自动测试很有用。
这个函数在Qt 5.0中引入。
也请参见clearConnectionCache()。

void QNetworkAccessManager::clearConnectionCache()

冲洗网络连接的内部缓存。与clearAccessCache()相反,认证数据被保留下来。
这个函数在Qt 5.9中引入。
参见clearAccessCache()。

QNetworkConfiguration QNetworkAccessManager::configuration() const

返回用于创建网络会话的网络配置,该配置将在处理网络请求时使用。
这个函数在Qt 4.7中引入。
也请参见setConfiguration()和activeConfiguration()。

void QNetworkAccessManager::connectToHost(const QString &hostName, quint16 port = 80)

启动与hostName给出的主机在端口的连接。这个函数有助于在HTTP请求发出之前完成与主机的TCP握手,从而降低网络延迟。
注意:这个函数不可能报告错误。
这个函数在Qt 5.2中引入。
参见connectToHostEncrypted(), get(), post(), put(), and deleteResource()。

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

使用sslConfiguration启动与hostName给出的主机在端口的连接。这个函数对于在HTTPS请求之前完成与主机的TCP和SSL握手是很有用的,从而降低网络延迟。
注意:预连接一个SPDY连接可以通过调用sslConfiguration上的setAllowedNextProtocols()来完成,QSslConfiguration::NextProtocolSpdy3_0包含在允许的协议列表中。当使用SPDY时,每个主机只有一个连接就足够了,也就是说,每个主机多次调用这个方法不会带来更快的网络交易。
注意:这个函数没有报告错误的可能性。
这个函数是在Qt 5.2中引入的。
另见connectToHost(), get(), post(), put(), 和deleteResource()。

QNetworkCookieJar *QNetworkAccessManager::cookieJar() const

返回QNetworkCookieJar,用于存储从网络上获得的cookie以及即将发送的cookie。也请参见setCookieJar()。

[virtual protected] QNetworkReply *QNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &originalReq, QIODevice *outgoingData = Q_NULLPTR)

返回一个新的QNetworkReply对象来处理操作op和请求originalReq。对于Get和Head请求,设备outgoingData总是0,但在这些操作中是传递给post()和put()的值(QByteArray的变体将传递一个QBuffer对象)。
默认的实现是在用setCookieJar()设置的cookie罐上调用QNetworkCookieJar::cookiesForUrl(),以获得将被发送到远程服务器的cookie。
返回的对象必须处于开放状态。

QNetworkReply *QNetworkAccessManager::deleteResource(const QNetworkRequest &request)

发送一个请求,删除由请求的URL标识的资源。
注意:这个功能目前只适用于HTTP,执行HTTP DELETE请求。
这个函数是在Qt 4.6中引入的。
参见get(), post(), put(), and sendCustomRequest()。

[信号] void QNetworkAccessManager::encrypted(QNetworkReply *reply)

当一个SSL/TLS会话成功地完成了最初的握手,这个信号就会发出。在这一点上,没有用户数据被传输。这个信号可以用来对证书链进行额外的检查,例如,当一个网站的证书发生变化时通知用户。回复参数指定由哪个网络回复负责。如果回复不符合预期的标准,那么应该通过调用QNetworkReply::abort()由连接到这个信号的槽来中止它。使用中的SSL配置可以通过QNetworkReply::sslConfiguration()方法进行检查。
在内部,QNetworkAccessManager可以打开多个连接到一个服务器,以允许它并行地处理请求。这些连接可以被重复使用,这意味着加密()信号不会被发射出来。这意味着,在QNetworkAccessManager的生命周期中,你只能保证在第一次连接到一个站点时收到这个信号。
这个函数是在Qt 5.1中引入的。
参见QSslSocket::encrypted() 和 QNetworkReply::encrypted()。

[信号] void QNetworkAccessManager:: finished(QNetworkReply *reply)

每当一个待定的网络回复完成时,就会发出这个信号。reply参数将包含一个指向刚刚完成的回复的指针。这个信号与QNetworkReply::finished()信号同时发出。
参见QNetworkReply::finished()以了解该对象将处于何种状态。
注意:不要删除与此信号相连的槽中的回复对象。使用deleteLater()。
也请看QNetworkReply::finished()和QNetworkReply::error()。

QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request)

发布一个请求以获取目标请求的内容,并返回一个新的QNetworkReply对象,该对象在新数据到达时发出readyRead()信号,以供读取。
内容以及相关的头文件将被下载。
参见post(), put(), deleteResource(), and sendCustomRequest()。

QNetworkReply *QNetworkAccessManager::head(const QNetworkRequest &request)

发布一个请求以获得请求的网络头信息,并返回一个新的QNetworkReply对象,该对象将包含这些头信息。
该函数是以HTTP请求相关的(HEAD)命名的。

bool QNetworkAccessManager::isStrictTransportSecurityEnabled() const

如果HTTP严格传输安全(HSTS)被启用,返回true。默认情况下,HSTS是禁用的。
这个函数在Qt 5.9中引入。
参见setStrictTransportSecurityEnabled()。

NetworkAccessibility QNetworkAccessManager::networkAccessible() const

返回当前的网络可访问性。
这个函数在Qt 4.7中引入。
注:属性networkAccessible的getter函数。
也请参见setNetworkAccessible()。

[信号] void QNetworkAccessManager::networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility accessible)

当networkAccessible属性的值发生变化时,这个信号就会被发射出来。 accessible是新的网络可访问性。
注意:属性networkAccessible的通知器信号。

QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, QIODevice *data)

向请求指定的目的地发送HTTP POST请求,并返回一个新的开放供读取的QNetworkReply对象,其中将包含服务器发送的回复。数据设备的内容将被上传到服务器。
数据必须是为阅读而打开的,并且必须保持有效,直到这个回复的finished()信号被发射出来。
注意:在HTTP和HTTPS以外的协议上发送POST请求是未定义的,很可能会失败。
另见get(), put(), deleteResource(), and sendCustomRequest()。

QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, const QByteArray &data)

这是一个重载函数。
将数据字节数组的内容发送到请求指定的目的地。

QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, QHttpMultiPart *multiPart)

这是一个重载函数。
将multiPart消息的内容发送到请求所指定的目的地。
这可用于通过HTTP发送MIME多部分消息。
这个函数在Qt 4.8中被引入。
参见QHttpMultiPart, QHttpPart, 和put()。

[信号] void QNetworkAccessManager::preSharedKeyAuthenticationRequired(QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator)

如果SSL/TLS握手协商了一个PSK密码组,因此需要进行PSK认证,那么就会发出这个信号。回复对象是正在协商这种密码组的QNetworkReply。
当使用PSK时,客户端必须向服务器发送一个有效的身份和一个有效的预共享密钥,以便SSL握手继续进行。应用程序可以在与该信号相连的槽中提供这些信息,根据他们的需要填写传递的认证器对象。
注意:忽视这个信号,或未能提供所需的凭证,将导致握手失败,从而导致连接中止。
注意:认证器对象为回复所拥有,应用程序不得删除。
这个函数是在Qt 5.5中引入的。
也请参见QSslPreSharedKeyAuthenticator。

QNetworkProxy QNetworkAccessManager::proxy() const

返回使用此QNetworkAccessManager对象发送的请求将使用的QNetworkProxy。代理的默认值是QNetworkProxy::DefaultProxy。
参见setProxy(), setProxyFactory(), and proxyAuthenticationRequired()。

[信号] void QNetworkAccessManager::proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)

当一个代理请求认证,而QNetworkAccessManager无法找到有效的、缓存的证书时,就会发出这个信号。连接到这个信号的槽应该在认证器对象中填入代理机构的凭证。
QNetworkAccessManager将在内部缓存该凭证。下次代理请求认证时,QNetworkAccessManager将自动发送相同的凭证,而不会再次发出proxyAuthenticationRequired信号。
如果代理拒绝凭证,QNetworkAccessManager将再次发出信号。
参见proxy(), setProxy(), and authenticationRequired()。

QNetworkProxyFactory *QNetworkAccessManager::proxyFactory() const

返回这个QNetworkAccessManager对象用来决定请求所使用的代理的代理工厂。
请注意,这个函数返回的指针由QNetworkAccessManager管理,可以在任何时候被删除。
这个函数是在Qt 4.5中引入的。
也请参见setProxyFactory()和proxy()。

QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, QIODevice *data)

将数据的内容上传到目标请求,并返回一个新的QNetworkReply对象,该对象将被打开用于回复。
当这个函数被调用时,数据必须被打开以备阅读,并且必须保持有效,直到这个回复的finished()信号被发射出来。
是否有东西可以从返回的对象中读取,这取决于协议。对于HTTP来说,服务器可能会发送一个小的HTML页面,表明上传成功(或不成功)。其他协议可能会在他们的回复里有内容。
注意:对于HTTP,这个请求将发送一个PUT请求,大多数服务器不允许这样做。表单上传机制,包括通过HTML表单上传文件的机制,使用POST机制。
参见get(), post(), deleteResource(), and sendCustomRequest()。

QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, const QByteArray &data)

这是一个重载函数。
将数据字节数组的内容发送到请求指定的目的地。
QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, QHttpMultiPart *multiPart)
这是一个重载函数。
将multiPart消息的内容发送到请求所指定的目的地。
这可用于通过HTTP发送MIME多部分消息。
这个函数在Qt 4.8中被引入。
参见QHttpMultiPart, QHttpPart, 和post()。

QNetworkRequest::RedirectPolicy QNetworkAccessManager::redirectPolicy() const

返回在创建新请求时使用的重定向策略。
这个函数在Qt 5.9中引入。
参见setRedirectPolicy()和QNetworkRequest::RedirectPolicy。

QNetworkReply *QNetworkAccessManager::sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = Q_NULLPTR)

发送一个自定义请求到由请求的URL确定的服务器。
用户有责任向服务器发送一个根据HTTP规范有效的动词。
这个方法提供了除通过get()或post()等提供的普通动词之外的其他方法,例如发送HTTP OPTIONS命令。
如果数据不是空的,数据设备的内容将被上传到服务器;在这种情况下,数据必须是开放的,可以阅读,并且必须保持有效,直到这个回复的finished()信号被发出。
注意:这个功能目前只适用于HTTP(S)。
这个函数是在Qt 4.7中引入的。
也请参见get(), post(), put(), and deleteResource()。

QNetworkReply *QNetworkAccessManager::sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, const QByteArray &data)

这是一个重载函数。
将数据字节数组的内容发送到请求指定的目的地。
这个函数在Qt 5.8中引入。

QNetworkReply *QNetworkAccessManager::sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QHttpMultipart *multiPart)

这是一个重载函数。
向由请求的URL识别的服务器发送一个自定义请求。
将multiPart消息的内容发送到请求指定的目的地。
这可用于发送自定义动词的MIME多部件消息。
这个函数是在Qt 5.8中引入的。
参见QHttpMultiPart, QHttpPart, 和put()。

void QNetworkAccessManager::setCache(QAbstractNetworkCache *cache)

将管理器的网络缓存设置为指定的缓存。该缓存被用于管理器派发的所有请求。
使用这个函数可以将网络缓存对象设置为一个实现额外功能的类,比如将cookie保存到永久存储。
注意:QNetworkAccessManager取得了缓存对象的所有权。
QNetworkAccessManager默认没有设置缓存。Qt提供了一个简单的磁盘缓存,QNetworkDiskCache,可以使用它。
这个函数是在Qt 4.5中引入的。
参见cache()和QNetworkRequest::CacheLoadControl。

void QNetworkAccessManager::setConfiguration(const QNetworkConfiguration &config)

将创建网络会话时使用的网络配置设置为config。
在任何需要网络访问的请求被处理之前,网络配置被用来创建和打开一个网络会话。如果没有通过这个函数明确地设置网络配置,将使用由QNetworkConfigurationManager::defaultConfiguration()返回的网络配置。
要恢复默认的网络配置,请将网络配置设置为从QNetworkConfigurationManager::defaultConfiguration()返回的值。
设置一个网络配置意味着QNetworkAccessManager实例将只使用指定的配置。特别是,如果默认的网络配置发生了变化(例如,当Wifi可用时),如果需要的话,这个新的配置需要被手动启用。

  QNetworkConfigurationManager manager;
  networkAccessManager->setConfiguration(manager.defaultConfiguration());

如果设置了一个无效的网络配置,网络会话将不会被创建。在这种情况下,网络请求将被处理,但可能会失败。比如说:

  networkAccessManager->setConfiguration(QNetworkConfiguration());

这个函数是在Qt 4.7中引入的。
参见configuration()和QNetworkSession。

void QNetworkAccessManager::setCookieJar(QNetworkCookieJar *cookieJar)

将管理器的cookie罐设置为指定的cookieJar。该cookie罐被管理器派发的所有请求所使用。
使用这个函数可以将cookie jar对象设置为一个实现额外功能的类,比如将cookie保存到永久存储。
注意:QNetworkAccessManager获取cookieJar对象的所有权。
如果cookieJar与这个QNetworkAccessManager在同一个线程中,它将设置cookieJar的父对象,这样,当这个对象被删除时,cookie jar也会被删除。如果你想在不同的QNetworkAccessManager对象之间共享cookie罐,你可能想在调用这个函数后把cookie罐的父级设置为0。
QNetworkAccessManager默认情况下没有实现任何自己的cookie策略:它接受所有由服务器发送的cookie,只要这些cookie结构良好并符合最低的安全要求(cookie域与请求的匹配,cookie路径与请求的匹配)。为了实现你自己的安全策略,请覆盖QNetworkCookieJar::cookiesForUrl()和QNetworkCookieJar::setCookiesFromUrl()虚拟函数。当QNetworkAccessManager检测到一个新的cookie时,它将调用这些函数。
参见cookieJar(), QNetworkCookieJar::cookiesForUrl(), 和QNetworkCookieJar::setCookiesFromUrl()。

void QNetworkAccessManager::setNetworkAccessible(NetworkAccessibility accessible)

重写报告中的网络可访问性。如果可访问性是NotAccessible,报告的网络可访问性将始终是NotAccessible。否则,报告的网络可访问性将反映实际的设备状态。
这个函数在Qt 4.7中引入。
注:属性networkAccessible的设置函数。
也请看networkAccessible()。

void QNetworkAccessManager::setProxy(const QNetworkProxy &proxy)

设置未来请求中使用的代理。这并不影响已经发送的请求。如果代理要求认证,proxyAuthenticationRequired()信号将被发射出来。
用这个函数设置的代理将被用于QNetworkAccessManager发出的所有请求。在某些情况下,可能需要根据所发送的请求类型或目标主机选择不同的代理。如果是这种情况,你应该考虑使用setProxyFactory()。
另见proxy()和proxyAuthenticationRequired()。

void QNetworkAccessManager::setProxyFactory(QNetworkProxyFactory *factory)

将这个类的代理工厂设置为工厂。代理工厂用于确定一个更具体的代理列表,用于给定的请求,而不是试图对所有请求使用相同的代理值。
所有由QNetworkAccessManager发送的查询将具有QNetworkProxyQuery::UrlRequest类型。
例如,一个代理工厂可以应用以下规则。
如果目标地址在本地网络中(例如,如果主机名不包含点,或者是组织范围内的IP地址),返回 QNetworkProxy::NoProxy
如果请求是FTP,返回一个FTP代理
如果请求是HTTP或HTTPS,那么返回一个HTTP代理
否则,返回一个SOCKSv5代理服务器
对象工厂的寿命将由QNetworkAccessManager管理。它将在必要时删除该对象。
注意:如果用setProxy()设置了一个特定的代理,该工厂将不会被使用。
这个函数是在Qt 4.5中引入的。
参见proxyFactory(), setProxy(), 和QNetworkProxyQuery。

void QNetworkAccessManager::setRedirectPolicy(QNetworkRequest::RedirectPolicy policy)

将管理器的重定向策略设置为指定的策略。这个策略将影响所有由管理器创建的后续请求。
使用这个函数可以在管理器的层面上启用或禁用HTTP重定向。
注意:当创建一个请求时,QNetworkRequest::RedirectAttributePolicy的优先级最高,接下来的优先级是QNetworkRequest::FollowRedirectsAttribute。最后,管理器的策略具有最低的优先级。
为了向后兼容,默认值是QNetworkRequest::ManualRedirectPolicy。这在未来可能会发生变化,某种类型的自动重定向策略将成为默认值;我们鼓励依赖手动重定向处理的客户在他们的代码中明确设置这个策略。
这个函数是在Qt 5.9中引入的。
参见redirectPolicy(), QNetworkRequest::RedirectPolicy, 和QNetworkRequest::FollowRedirectsAttribute。

void QNetworkAccessManager::setStrictTransportSecurityEnabled(bool enabled)

如果启用为真,QNetworkAccessManager遵循HTTP严格传输安全策略(HSTS,RFC6797)。当处理一个请求时,QNetworkAccessManager会自动将 "http "方案替换为 "https",并为HSTS主机使用安全传输。如果明确设置,端口80会被端口443取代。
当HSTS被启用时,对于每个包含HSTS头并通过安全传输接收的HTTP响应,QNetworkAccessManager将更新其HSTS缓存,要么记住一个具有有效策略的主机,要么删除一个具有过期或禁用HSTS策略的主机。
这个函数是在Qt 5.9中引入的。
请参见isStrictTransportSecurityEnabled()。

[信号] void QNetworkAccessManager::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors)

如果SSL/TLS会话在设置过程中遇到错误,包括证书验证错误,就会发出这个信号。errors参数包含错误列表,reply是遇到这些错误的QNetworkReply。
为了表明这些错误不是致命的,连接应该继续进行,应该从连接到这个信号的槽中调用QNetworkReply::ignoreSslErrors()函数。如果不调用该函数,在任何数据交换(包括URL)之前,SSL会话将被撕毁。
这个信号可以用来向用户显示一个错误信息,表明安全可能受到影响,并显示SSL设置(见sslConfiguration()获取)。如果用户在分析了远程证书后决定继续进行,槽应该调用ignoreSslErrors()。
参见QSslSocket::sslErrors(), QNetworkReply::sslErrors(), QNetworkReply::sslConfiguration(), 和QNetworkReply::ignoreSslErrors()。

QVector<QHstsPolicy> QNetworkAccessManager::strictTransportSecurityHosts() const

返回HTTP严格传输安全策略的列表。如果HSTS缓存从 "Strict-Transport-Security "响应头更新,这个列表可能与最初通过addStrictTransportSecurityHosts()设置的不同。
这个函数是在Qt 5.9中引入的。
参见addStrictTransportSecurityHosts()和QHstsPolicy。

QStringList QNetworkAccessManager::supportedSchemes() const

列出访问管理器支持的所有URL方案。
这个函数在Qt 5.2中被引入。
也请参见supportedSchemesImplementation()。

[protected slot] QStringList QNetworkAccessManager::supportedSchemesImplementation() const

列出访问管理器支持的所有URL方案。

你不应该直接调用这个函数,而应该使用QNetworkAccessManager::supportedSchemes()。
重新实现这个槽,在QNetworkAccessManager子类中提供你自己支持的方案。例如,当你的子类提供对新协议的支持时,它是必要的。
由于二进制兼容性的限制,supportedSchemes()方法(在Qt 5.2中引入)不是虚拟的。相反,supportedSchemes()将动态地检测并调用这个槽。
这个函数是在Qt 5.2中引入的。
参见supportedSchemes()。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Roson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值