一、描述
   
1、Qt网络访问 API 是围绕 QNetworkAccessManager 对象构建的,该对象保存它发送的请求的通用配置和设置。一个 QNetworkAccessManager 实例应该足以满足整个 Qt 应用程序网络访问的需求。 由于 QNetworkAccessManager 是基于 QObject 的,所以只能在它所属的线程中使用。
2、一旦创建了 QNetworkAccessManager 对象,应用程序就可以使用它通过网络发送请求。它提供了一组标准函数,它们接受一个请求和可选数据,每个函数都返回一个 QNetworkReply 对象。返回的对象用于获取响应相应请求而返回的任何数据。
可以通过以下方式完成简单的网络下载:
 QNetworkAccessManager *manager = new QNetworkAccessManager(this);
 connect(manager, &QNetworkAccessManager::finished, this, &MyClass::replyFinished);
 manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
    3、QNetworkAccessManager 有一个异步 API。 当上面的 replyFinished 槽函数被调用时,它采用的参数是
    
     QNetworkReply
    
    对象,包含下载的数据以及元数据(标题等)。
   
    注意:
    
     
      请求完成后,用户有责任在适当的时候删除 QNetworkReply 对象。不要在连接到finished()的slot里面直接删除,可以使用 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, &QIODevice::readyRead, this, &MyClass::slotReadyRead);
 connect(reply, &QNetworkReply::errorOccurred,this, &MyClass::slotError);
 connect(reply, &QNetworkReply::sslErrors,this, &MyClass::slotSslErrors);
    二、类型成员
   
    1、enum QNetworkAccessManager::
    
     
      Operation
     
    
    :指示回复正在处理的操作。
   
- 
     
 HeadOperation
 
 :检索headers操作(使用
 
 head
 
 () 创建)
- 
     
 GetOperation
 
 :检索headers和下载内容(使用
 
 get
 
 () 创建)
- 
     
 PutOperation
 
 :上传内容操作(使用
 
 put
 
 () 创建)
- 
     
 PostOperation
 
 :发送 HTML 表单的内容以通过 HTTP POST 进行处理(使用
 
 post
 
 () 创建)
- 
     
 DeleteOperation
 
 :删除内容操作(使用
 
 deleteResource
 
 () 创建)
- 
     
 CustomOperation
 
 :自定义操作(使用
 
 sendCustomRequest
 
 () 创建)
    三、成员函数
   
    1、[
    
     
      signal
     
    
    ] void
    
     authenticationRequired
    
    (QNetworkReply *reply, QAuthenticator *authenticator)
   
每当服务器在交付请求的内容之前请求身份验证时,都会发出此信号。连接到此信号的槽函数应填充验证器对象中的凭据。
QNetworkAccessManager 将在内部缓存凭据,如果服务器再次需要身份验证,则将发送相同的值,而不发出此信号。如果服务器拒绝凭据,将再次发出此信号。
注意:无法使用
QueuedConnection
连接到此信号,因为如果在信号返回时验证器未填充新信息,则连接将失败。
    2、[
    
     
      signal
     
    
    ] void
    
     encrypted
    
    (QNetworkReply *reply)
   
当 SSL/TLS 会话成功完成初始握手时,会发出此信号。此时,还没有传输用户数据。
    3、[
    
     
      signal
     
    
    ] void
    
     finished
    
    (QNetworkReply *reply)
   
网络回复完成时会发出此信号。回复参数将包含一个指向刚刚完成的回复的指针。该信号与
QNetworkReply
::
finished
() 信号一起发出。注意:不要直接删除连接到该信号的槽中的回复对象。应使用
deleteLater
()。
    4、[
    
     
      signal
     
    
    ] void
    
     preSharedKeyAuthenticationRequired
    
    (QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator)
   
如果 SSL/TLS 握手协商 PSK 密码套件,则会发出此信号,因此需要 PSK 身份验证。 回复对象是正在协商此类密码套件的 QNetworkReply。
使用 PSK 时,客户端必须向服务器发送一个有效的身份和一个有效的预共享密钥,以便 SSL 握手继续进行。 应用程序可以在连接到这个信号的槽中提供这个信息,根据他们的需要填充传递的验证器对象。
注意:忽略此信号,或未能提供所需的凭据,将导致握手失败,从而中止连接。
注意:验证器对象归回复所有,不得被应用程序删除。
    5、[
    
     
      signal
     
    
    ] void
    
     proxyAuthenticationRequired
    
    (const QNetworkProxy &proxy, QAuthenticator *authenticator)
   
每当代理请求身份验证并且 QNetworkAccessManager 找不到有效的缓存凭据时,就会发出此信号。连接到此信号的槽函数应填写身份验证器对象中的代理凭据。
QNetworkAccessManager 将在内部缓存凭据。下次代理请求身份验证时,将自动发送相同的凭据,而不会再次发出此信号。
如果代理拒绝凭据,QNetworkAccessManager 将再次发出信号。
    6、[
    
     
      signal
     
    
    ] void
    
     sslErrors
    
    (QNetworkReply *reply, const QList<QSslError> &errors)
   
如果 SSL/TLS 会话在设置期间遇到错误,包括证书验证错误,则会发出此信号。 errors 参数包含错误列表,reply 是遇到这些错误的 QNetworkReply。
为了表明错误不是致命的并且连接应该继续,应该从连接到这个信号的槽函数调用
QNetworkReply
::
ignoreSslErrors
() 函数。如果未调用 SSL 会话将断开。此信号可用于向用户显示错误消息,指示安全性可能受到威胁并显示 SSL 设置。如果用户在分析远程证书后决定继续,则槽函数应调用 ignoreSslErrors()。
    7、void
    
     addStrictTransportSecurityHosts
    
    (const QVector<
    
     QHstsPolicy
    
    > &knownHosts)
   
将 HTTP 严格传输安全策略添加到 HSTS 缓存中。
    8、void
    
     
      clearAccessCache
     
    
    ()
   
刷新身份验证数据和网络连接的内部缓存。
    9、void
    
     
      clearConnectionCache
     
    
    ()
   
刷新网络连接的内部缓存。与
clearAccessCache
() 相比,身份验证数据被保留。
    10、void
    
     connectToHost
    
    (const QString &hostName, quint16 port = 80)
   
与指定的主机连接。
    11、void
    
     connectToHostEncrypted
    
    (const QString &hostName, quint16 port = 443, const QSslConfiguration &sslConfiguration = QSslConfiguration::defaultConfiguration())
   
使用 sslConfiguration 配置与指定的主机连接。
    12、void
    
     connectToHostEncrypted
    
    (const QString &hostName, quint16 port, const QSslConfiguration &sslConfiguration, const QString &peerName)
   
重载函数。使用 sslConfiguration 配置与指定的主机连接,peerName为用于证书验证的主机名。
    13、QNetworkReply *
    
     deleteResource
    
    (const QNetworkRequest &request)
   
发送请求以删除由请求的 URL 标识的资源。此功能目前仅适用于 HTTP,执行
HTTP DELETE
请求。
    14、QNetworkReply *
    
     get
    
    (const QNetworkRequest &request)
   
发布请求以获取内容,返回一个新的
QNetworkReply
对象,该对象在新数据到达时发出
readyRead
() 信号。
    15、QNetworkReply *
    
     head
    
    (const QNetworkRequest &request)
   
发布请求以获取请求的网络标头并返回一个新的 QNetworkReply 对象。
    16、QNetworkReply *
    
     post
    
    (const QNetworkRequest &request,
    
     QIODevice
    
    *data)
   
将 HTTP POST 请求发送到 request 指定的目的地,并返回一个新的 QNetworkReply 对象,该对象将包含服务器发送的回复。data的内容将上传到服务器。
data必须打开以供读取,并且必须保持有效,直到为此回复发出
finished
()信号。注意:在 HTTP 和 HTTPS 以外的协议上发送 POST 请求是未定义的,并且可能会失败。
    17、QNetworkReply *
    
     post
    
    (const QNetworkRequest &request, const QByteArray &data)
   
重载函数。将数据字节数组的内容发送到请求指定的目的地。
    18、QNetworkReply *
    
     post
    
    (const QNetworkRequest &request,
    
     QHttpMultiPart
    
    *multiPart)
   
重载函数。将 HTTP multipart MIME 消息的内容发送到请求指定的目的地。
    19、QNetworkReply *
    
     put
    
    (const QNetworkRequest &request, QIODevice *data)
   
将数据上传到request设置的目标并返回一个新的 QNetworkReply 对象。
调用此函数时,必须打开(
QIODevice
::
open
())设备以进行读取,并且必须保持有效,直到为此回复发出
finished
() 信号为止。
    20、QNetworkReply *
    
     put
    
    (const QNetworkRequest &request, const QByteArray &data)
   
    21、QNetworkReply *
    
     put
    
    (const QNetworkRequest &request, QHttpMultiPart *multiPart)
   
重载函数。
    22、QNetworkReply *
    
     
      sendCustomRequest
     
    
    (const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = nullptr)
   
向由请求的 URL 标识的服务器
发送自定义请求
。用户有责任将根据 HTTP 规范有效的动词发送到服务器。
此方法提供了发送除通过 get() 或 post() 等提供的常用动词以外的动词的方法,例如发送
HTTP OPTIONS
命令。如果数据不为空,则将数据设备的内容上传到服务器; 在这种情况下,必须打开(
QIODevice
::
open
())设备以进行读取,并且必须保持有效,直到为此回复发出
finished
() 信号为止。
    23、QNetworkReply *
    
     sendCustomRequest
    
    (const QNetworkRequest &request, const QByteArray &verb, const QByteArray &data)
   
    24、QNetworkReply *
    
     sendCustomRequest
    
    (const QNetworkRequest &request, const QByteArray &verb, QHttpMultiPart *multiPart)
   
重载函数。
    25、void
    
     setAutoDeleteReplies
    
    (bool shouldAutoDelete)
   
启用或禁用
QNetworkReply
的自动删除。设置为 true 与将 QNetworkRequest::
AutoDeleteReplyOnFinishAttribute
属性设置为 true 相同。
    26、void
    
     setCache
    
    (
    
     QAbstractNetworkCache
    
    *cache)
   
设置网络缓存对象。
    27、void
    
     setCookieJar
    
    (QNetworkCookieJar *cookieJar)
   
设置保存cookie的对象。
    28、void setProxy(const
    
     QNetworkProxy
    
    &proxy)
   
设置代理。
    29、void setProxyFactory(
    
     QNetworkProxyFactory
    
    *factory)
   
设置代理工厂。代理工厂用于具体的代理列表,而不是尝试对所有请求使用相同的代理值(即根据不同情况使用不同的代理)。QNetworkAccessManager 发送的所有查询都将具有
QNetworkProxyQuery
::
UrlRequest
类型。例如,代理工厂可以应用以下规则:
- 如果目标地址在本地网络中,则返回 QNetworkProxy::NoProxy
- 如果请求是 FTP,则返回一个 FTP 代理
- 如果请求是 HTTP 或 HTTPS,则返回 HTTP 代理
- 其他情况返回 SOCKSv5 代理服务器
如果使用
setProxy
() 设置了特定代理,则不会使用工厂。
    30、void setRedirectPolicy(
    
     QNetworkRequest
    
    ::RedirectPolicy policy)
   
设置重定向策略。
    31、void
    
     setStrictTransportSecurityEnabled
    
    (bool enabled)
   
设置是否遵循
HTTP 严格传输安全策略
(HSTS,RFC6797)。如果启用:
- 处理请求时,QNetworkAccessManager 会自动将“http”方案替换为“https”,并为 HSTS 主机使用安全传输。如果明确设置,则端口 80 将替换为端口 443。
- 对于每个包含 HSTS 标头并通过安全传输接收的 HTTP 响应,QNetworkAccessManager 将更新其 HSTS 缓存,或者记住具有有效策略的主机或删除具有过期或禁用 HSTS 策略的主机。
    32、void
    
     setTransferTimeout
    
    (int timeout = QNetworkRequest::DefaultTransferTimeoutConstant)
   
设置传输超时时间。如果在超时到期之前没有传输字节,传输将被中止。
零表示未设置计时器。如果未调用此函数,则超时将被禁用且值为 0。
    33、QVector<
    
     QHstsPolicy
    
    >
    
     strictTransportSecurityHosts
    
    ()
   
返回
HTTP 严格传输安全策略
列表。如果 HSTS 缓存是从“
Strict-Transport-Security
”响应标头更新的,则此列表可能与最初通过
addStrictTransportSecurityHosts
() 设置的不同。
    34、QStringList
    
     supportedSchemes
    
    ()
   
列出支持的所有
URL 方案
。
 
