QNetworkAccessManager Class
QNetworkAccessManager 类允许应用程序发送网络请求并接收回复。更多
Header: | #include <QNetworkAccessManager> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
qmake: | QT += network |
继承: | QObject |
- 所有成员(包括继承成员)的列表
- 已废弃成员
- QNetworkAccessManager 是网络编程 API 的一部分。
注意:该类中的所有函数都是可重入的。
公共类型
enum | Operation { HeadOperation, GetOperation, PutOperation, PostOperation, DeleteOperation, CustomOperation } |
公共函数
QNetworkAccessManager(QObject *parent = nullptr) | |
virtual | ~QNetworkAccessManager() |
void | addStrictTransportSecurityHosts(const QList<QHstsPolicy> &knownHosts) |
bool | autoDeleteReplies() const |
QAbstractNetworkCache * | cache() const |
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()) |
void | connectToHostEncrypted(const QString &hostName, quint16 port, const QSslConfiguration &sslConfiguration, const QString &peerName) |
QNetworkCookieJar * | cookieJar() const |
QNetworkReply * | deleteResource(const QNetworkRequest &request) |
void | enableStrictTransportSecurityStore(bool enabled, const QString &storeDir = QString()) |
QNetworkReply * | get(const QNetworkRequest &request) |
(since 6.7) QNetworkReply * | get(const QNetworkRequest &request, QIODevice *data) |
(since 6.7) QNetworkReply * | get(const QNetworkRequest &request, const QByteArray &data) |
QNetworkReply * | head(const QNetworkRequest &request) |
bool | isStrictTransportSecurityEnabled() const |
bool | isStrictTransportSecurityStoreEnabled() const |
QNetworkReply * | post(const QNetworkRequest &request, QIODevice *data) |
QNetworkReply * | post(const QNetworkRequest &request, QHttpMultiPart *multiPart) |
QNetworkReply * | post(const QNetworkRequest &request, const QByteArray &data) |
(since 6.8) QNetworkReply * | post(const QNetworkRequest &request, std::nullptr_t nptr) |
QNetworkProxy | proxy() const |
QNetworkProxyFactory * | proxyFactory() const |
QNetworkReply * | put(const QNetworkRequest &request, QIODevice *data) |
QNetworkReply * | put(const QNetworkRequest &request, QHttpMultiPart *multiPart) |
QNetworkReply * | put(const QNetworkRequest &request, const QByteArray &data) |
(since 6.8) QNetworkReply * | put(const QNetworkRequest &request, std::nullptr_t nptr) |
QNetworkRequest::RedirectPolicy | redirectPolicy() const |
QNetworkReply * | sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = nullptr) |
QNetworkReply * | sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QHttpMultiPart *multiPart) |
QNetworkReply * | sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, const QByteArray &data) |
void | setAutoDeleteReplies(bool shouldAutoDelete) |
void | setCache(QAbstractNetworkCache *cache) |
void | setCookieJar(QNetworkCookieJar *cookieJar) |
void | setProxy(const QNetworkProxy &proxy) |
void | setProxyFactory(QNetworkProxyFactory *factory) |
void | setRedirectPolicy(QNetworkRequest::RedirectPolicy policy) |
void | setStrictTransportSecurityEnabled(bool enabled) |
void | setTransferTimeout(int timeout) |
(since 6.7) void | setTransferTimeout(std::chrono::milliseconds duration = QNetworkRequest::DefaultTransferTimeout) |
QList<QHstsPolicy> | strictTransportSecurityHosts() const |
virtual QStringList | supportedSchemes() const |
int | transferTimeout() const |
(since 6.7) std::chrono::milliseconds | transferTimeoutAsDuration() const |
信号
void | authenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator) |
void | encrypted(QNetworkReply *reply) |
void | finished(QNetworkReply *reply) |
void | preSharedKeyAuthenticationRequired(QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator) |
void | proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator) |
void | sslErrors(QNetworkReply *reply, const QList<QSslError> &errors) |
受保护函数
virtual QNetworkReply * | createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &originalReq, QIODevice *outgoingData = nullptr) |
详细说明
网络访问 API 是围绕一个 QNetworkAccessManager 对象构建的,该对象为其发送的请求提供了通用配置和设置。它包含代理和缓存配置,以及与这些问题相关的信号和可用于监控网络操作进度的回复信号。对于整个 Qt 应用程序来说,一个 QNetworkAccessManager 实例就足够了。由于 QNetworkAccessManager 基于QObject ,因此只能在所属线程中使用。
一旦创建了 QNetworkAccessManager 对象,应用程序就可以使用它通过网络发送请求。我们提供了一组标准函数,它们接收请求和可选数据,并分别返回一个QNetworkReply 对象。返回的对象用于获取响应相应请求而返回的任何数据。
一个简单的网络下载可以用
QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, &QNetworkAccessManager::finished, this, &MyClass::replyFinished); manager->get(QNetworkRequest(QUrl("http://qt-project.org")));
QNetworkAccessManager 有一个异步 API。当调用上述replyFinished
插槽时,它所接收的参数是QNetworkReply 对象,其中包含下载的数据和元数据(头信息等)。
注意: 请求完成后,用户有责任在适当的时候删除QNetworkReply 对象。请勿在连接到finished() 的槽内直接删除该对象。您可以使用deleteLater() 函数。
注意: QNetworkAccessManager 会对收到的请求进行排队。并行执行的请求数量取决于协议。目前,对于桌面平台上的 HTTP 协议,一个主机/端口组合可并行执行 6 个请求。
注意: QNetworkAccessManager 无法正确处理 RFC 2616 第 8.2.2 节,因为它在写入数据之前不会对传入数据做出反应。例如,即使服务器返回的状态代码指示客户端不要继续,大文件的上传也不会停止。
假设管理器已经存在,可以举一个更复杂的例子:
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);
另请参阅 QNetworkRequest,QNetworkReply, 和QNetworkProxy 。
成员类型文档
enum QNetworkAccessManager::Operation
表示该回复正在处理的操作。
常数 | 值 | 说明 |
---|---|---|
QNetworkAccessManager::HeadOperation | 1 | 检索标题操作(通过head() 创建) |
QNetworkAccessManager::GetOperation | 2 | 检索标题和下载内容操作(通过get() 创建) |
QNetworkAccessManager::PutOperation | 3 | 上传内容操作(通过put() 创建) |
QNetworkAccessManager::PostOperation | 4 | 通过 HTTP POST 发送 HTML 表单内容供处理(通过post() 创建) |
QNetworkAccessManager::DeleteOperation | 5 | 删除内容操作(通过deleteResource() 创建) |
QNetworkAccessManager::CustomOperation | 6 | 自定义操作(通过sendCustomRequest() 创建) |
另请参见 QNetworkReply::operation()。
成员函数文档
[explicit]
QNetworkAccessManager::QNetworkAccessManager(QObject *parent = nullptr)
构造一个作为网络访问 API 中心的 QNetworkAccessManager 对象,并将parent 设置为父对象。
[virtual noexcept]
QNetworkAccessManager::~QNetworkAccessManager()
销毁QNetworkAccessManager 对象并释放所有资源。请注意,从该类返回的QNetworkReply 对象已将该对象设置为父对象,这意味着如果不对它们调用QObject::setParent() ,它们将与该对象一起被删除。
void QNetworkAccessManager::addStrictTransportSecurityHosts(const QList<QHstsPolicy> &knownHosts)
将 HTTP 严格传输安全策略添加到 HSTS 缓存中。knownHosts 包含有QHstsPolicy 信息的已知主机。
注: 过期策略将从缓存中删除已知主机(如果之前存在)。
注: 在处理 HTTP 响应时,QNetworkAccessManager 也可以更新 HSTS 缓存,删除或更新退出策略或引入新的knownHosts 。因此,当前的实现是服务器驱动的,客户端代码可以向QNetworkAccessManager 提供先前已知或发现的策略,但这些信息可以被 "Strict-Transport-Security "响应头覆盖。
另请参阅 addStrictTransportSecurityHosts()、enableStrictTransportSecurityStore() 和QHstsPolicy 。
[signal]
void QNetworkAccessManager::authenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator)
每当最终服务器在传送所请求的内容之前请求身份验证时,就会发出该信号。连接到此信号的槽应在authenticator 对象中填写内容的凭据(可通过检查reply 对象确定)。
QNetworkAccessManager 如果服务器再次要求进行身份验证,该插件将在内部缓存证书,并发送相同的值,而不会发出 authenticationRequired() 信号。如果拒绝证书,将再次发出该信号。
注意: 要使请求不发送凭证,就不能在authenticator 对象上调用 setUser() 或 setPassword()。这将导致finished() 信号与QNetworkReply 错误AuthenticationRequiredError 一起发出。
注意: 不能使用 QueuedConnection 连接到该信号,因为如果信号返回时验证器没有填入新信息,连接就会失败。
另请参阅 proxyAuthenticationRequired()、QAuthenticator::setUser() 和QAuthenticator::setPassword()。
bool QNetworkAccessManager::autoDeleteReplies() const
如果QNetworkAccessManager 当前配置为自动删除 QNetworkReplies,则返回 true,否则返回 false。
另请参阅 setAutoDeleteReplies 和QNetworkRequest::AutoDeleteReplyOnFinishAttribute 。
QAbstractNetworkCache *QNetworkAccessManager::cache() const
返回用于存储从网络获取的数据的缓存。
另请参阅 setCache()。
void QNetworkAccessManager::clearAccessCache()
刷新身份验证数据和网络连接的内部缓存。
该函数在进行自动测试时非常有用。
另请参见 clearConnectionCache()。
void QNetworkAccessManager::clearConnectionCache()
刷新网络连接的内部缓存。与clearAccessCache() 不同的是,认证数据将被保留。
另请参见 clearAccessCache()。
void QNetworkAccessManager::connectToHost(const QString &hostName, quint16 port = 80)
在port 端口启动与hostName 指定主机的连接。该函数用于在 HTTP 请求发出前完成与主机的 TCP 握手,从而降低网络延迟。
注意: 该函数不能报错。
另请参阅 connectToHostEncrypted(),get(),post(),put() 和deleteResource().
void QNetworkAccessManager::connectToHostEncrypted(const QString &hostName, quint16 port = 443, const QSslConfiguration &sslConfiguration = QSslConfiguration::defaultConfiguration())
使用sslConfiguration 在port 端口启动与hostName 指定主机的连接。该函数用于在 HTTPS 请求发出前完成与主机的 TCP 和 SSL 握手,从而降低网络延迟。
注: 在sslConfiguration 上调用 setAllowedNextProtocols(),并将QSslConfiguration::ALPNProtocolHTTP2 包含在允许的协议列表中,即可实现 HTTP/2 连接的预连接。使用 HTTP/2 时,每台主机只需一个连接即可,即每台主机多次调用此方法不会加快网络交易速度。
注意: 此函数无法报告错误。
另请参阅 connectToHost()、get()、post()、put() 和deleteResource()。
void QNetworkAccessManager::connectToHostEncrypted(const QString &hostName, quint16 port, const QSslConfiguration &sslConfiguration, const QString &peerName)
这是一个重载函数。
使用sslConfiguration 启动与hostName 指定的主机的连接,连接端口为port ,并将peerName 设置为用于证书验证的主机名。该函数用于在发出 HTTPS 请求前完成与主机的 TCP 和 SSL 握手,从而降低网络延迟。
注: 在sslConfiguration 上调用 setAllowedNextProtocols() 可以实现 HTTP/2 连接的预连接,QSslConfiguration::ALPNProtocolHTTP2 包含在允许的协议列表中。使用 HTTP/2 时,每台主机只需一个连接即可,即每台主机多次调用此方法不会加快网络交易速度。
注意: 此函数无法报告错误。
另请参阅 connectToHost()、get()、post()、put() 和deleteResource()。
QNetworkCookieJar *QNetworkAccessManager::cookieJar() const
返回用于存储从网络获取的 cookie 和即将发送的 cookie 的QNetworkCookieJar 。
另请参阅 setCookieJar().
[virtual protected]
QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &originalReq, QIODevice *outgoingData = nullptr)
返回一个新的QNetworkReply 对象,用于处理操作op 和请求originalReq 。对于 Get(获取)和 Head(头部)请求,设备outgoingData 始终为 0,但它是这些操作中传递给post() 和put() 的值(QByteArray 变体将传递QBuffer 对象)。
默认实现在使用setCookieJar() 设置的 cookie jar 上调用QNetworkCookieJar::cookiesForUrl() 以获取要发送到远程服务器的 cookie。
返回的对象必须处于打开状态。
QNetworkReply *QNetworkAccessManager::deleteResource(const QNetworkRequest &request)
发送删除由request 的 URL 标识的资源的请求。
注: 此功能目前仅适用于 HTTP,执行 HTTP DELETE 请求。
另请参阅 get()、post()、put() 和sendCustomRequest() 。
void QNetworkAccessManager::enableStrictTransportSecurityStore(bool enabled, const QString &storeDir = QString())
如果enabled 是true
,内部 HSTS 缓存将使用持久存储读写 HSTS 策略。storeDir 定义了该存储的位置。默认位置由QStandardPaths::CacheLocation 定义。如果没有可写的 QStandartPaths::CacheLocation,且storeDir 为空字符串,则存储将位于程序的工作目录中。
注意: 如果在启用持久存储时,HSTS 缓存已包含 HSTS 策略,这些策略将保留在存储中。如果缓存和存储都包含相同的已知主机,缓存中的策略会被认为是最新的(因此会覆盖存储中以前的值)。如果不希望出现这种情况,请在启用严格传输安全之前启用 HSTS 存储。默认情况下,HSTS 策略的持久存储是禁用的。
另请参阅 isStrictTransportSecurityStoreEnabled()、setStrictTransportSecurityEnabled() 和QStandardPaths::standardLocations()。
[signal]
void QNetworkAccessManager::encrypted(QNetworkReply *reply)
当 SSL/TLS 会话成功完成初始握手时,就会发出该信号。此时,用户数据尚未传输。该信号可用于对证书链进行额外检查,例如在网站证书发生变化时通知用户。reply 参数指定由哪个网络回复负责。如果回复不符合预期标准,则应通过与该信号相连的插槽调用QNetworkReply::abort() 中止回复。使用QNetworkReply::sslConfiguration() 方法可以检查正在使用的 SSL 配置。
在内部,QNetworkAccessManager 可以打开多个服务器连接,以便并行处理请求。这些连接可能会被重复使用,这意味着不会发出 encrypted() 信号。这就意味着,只有在QNetworkAccessManager 的生命周期内首次连接到某个站点时,才能保证收到该信号。
另请参见 QSslSocket::encrypted() 和QNetworkReply::encrypted()。
[signal]
void QNetworkAccessManager::finished(QNetworkReply *reply)
每当待处理的网络回复结束时,就会发出该信号。reply 参数将包含一个指向刚刚结束的回复的指针。该信号与QNetworkReply::finished() 信号同时发出。
有关对象所处状态的信息,请参阅QNetworkReply::finished() 。
注意: 请勿删除与此信号连接的插槽中的reply 对象。请使用deleteLater() 信号。
另请参阅 QNetworkReply::finished() 和QNetworkReply::error()。
QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request)
发出获取目标request 内容的请求,并返回一个新的QNetworkReply 对象,该对象会在有新数据到达时发出readyRead() 信号。
将下载内容以及相关的标头。
另请参阅 post()、put()、deleteResource() 和sendCustomRequest()。
[since 6.7]
QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request, QIODevice *data)
这是一个重载函数。
注: 不缓存带消息体的 GET 请求。
注意: 如果请求被重定向,只有状态代码为 308 时才会保留消息体。
此函数在 Qt 6.7 中引入。
[since 6.7]
QNetworkReply *QNetworkAccessManager::get(const QNetworkRequest &request, const QByteArray &data)
这是一个重载函数。
注: 不缓存带消息体的 GET 请求。
注意: 如果请求被重定向,只有状态代码为 308 时才会保留消息体。
此函数在 Qt 6.7 中引入。
QNetworkReply *QNetworkAccessManager::head(const QNetworkRequest &request)
发布请求以获取request 的网络报头,并返回一个包含此类报头的新QNetworkReply 对象。
该函数以与 HTTP 请求相关的 (HEAD) 命名。
bool QNetworkAccessManager::isStrictTransportSecurityEnabled() const
如果已启用 HTTP 严格传输安全 (HSTS),则返回 true。默认情况下禁用 HSTS。
另请参阅 setStrictTransportSecurityEnabled().
bool QNetworkAccessManager::isStrictTransportSecurityStoreEnabled() const
如果 HSTS 缓存使用永久存储来加载和存储 HSTS 策略,则返回 true。
另请参阅 enableStrictTransportSecurityStore()。
QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, QIODevice *data)
向request 指定的目的地发送 HTTP POST 请求,并返回一个新的QNetworkReply 对象,该对象将包含服务器发送的回复。data 设备的内容将上传到服务器。
data 必须打开供读取,并且必须保持有效,直到 () 信号发出该回复。finished
注意: 在 HTTP 和 HTTPS 以外的协议上发送 POST 请求是未定义的,很可能会失败。
另请参见 get()、put()、deleteResource() 和sendCustomRequest()。
QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, QHttpMultiPart *multiPart)
这是一个重载函数。
将multiPart 消息的内容发送到request 指定的目的地。
可用于通过 HTTP 发送 MIME 多部分消息。
另请参阅 QHttpMultiPart,QHttpPart, 和put() 。
QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, const QByteArray &data)
这是一个重载函数。
将data 字节数组的内容发送到request 指定的目的地。
[since 6.8]
QNetworkReply *QNetworkAccessManager::post(const QNetworkRequest &request, std::nullptr_t nptr)
这是一个重载函数。
发送request 指定的 POST 请求(不含正文),并返回一个新的QNetworkReply 对象。
该函数在 Qt 6.8 中引入。
[signal]
void QNetworkAccessManager::preSharedKeyAuthenticationRequired(QNetworkReply *reply, QSslPreSharedKeyAuthenticator *authenticator)
如果 SSL/TLS 握手协商使用 PSK 密码套件,并因此需要 PSK 身份验证,则会发出该信号。reply 对象是正在协商此类密码套件的QNetworkReply 。
使用 PSK 时,客户端必须向服务器发送有效的身份信息和有效的预共享密钥,才能继续 SSL 握手。应用程序可根据自己的需要,通过填写传递的authenticator 对象,在与该信号相连的插槽中提供这些信息。
注: 忽略此信号或未提供所需凭证将导致握手失败,从而中止连接。
注: authenticator 对象归 reply 所有,应用程序不得删除。
另请参阅 QSslPreSharedKeyAuthenticator 。
QNetworkProxy QNetworkAccessManager::proxy() const
返回使用QNetworkAccessManager 对象发送的请求将使用的QNetworkProxy 。代理的默认值是QNetworkProxy::DefaultProxy 。
另请参阅 setProxy()、setProxyFactory() 和proxyAuthenticationRequired()。
[signal]
void QNetworkAccessManager::proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator *authenticator)
当代理请求身份验证且QNetworkAccessManager 无法找到有效的缓存凭据时,就会发出该信号。连接到此信号的插槽应在authenticator 对象中填写代理proxy 的凭据。
QNetworkAccessManager 代理将在内部缓存凭据。下一次代理请求身份验证时, 将自动发送相同的凭据,而不会再次发出 proxyAuthenticationRequired 信号。QNetworkAccessManager
如果代理拒绝接受凭据,QNetworkAccessManager 将再次发出信号。
另请参阅 proxy()、setProxy() 和authenticationRequired()。
QNetworkProxyFactory *QNetworkAccessManager::proxyFactory() const
返回QNetworkAccessManager 对象用于确定请求所用代理的代理工厂。
请注意,此函数返回的指针由QNetworkAccessManager 管理,可随时删除。
另请参阅 setProxyFactory() 和proxy()。
QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, QIODevice *data)
将data 的内容上传到目的地request ,并返回一个新的QNetworkReply 对象,该对象将开放供回复。
data 在调用此函数时, 对象必须已打开供读取,并且在 () 信号发出之前必须保持有效。finished
是否能从返回的对象中读取任何内容取决于协议。对于 HTTP 协议,服务器可能会发送一个小的 HTML 页面,说明上传是否成功。其他协议的回复可能会有内容。
注意: 对于 HTTP,该请求将发送 PUT 请求,而大多数服务器都不允许发送 PUT 请求。表单上传机制(包括通过 HTML 表单上传文件)使用 POST 机制。
另请参阅 get(),post(),deleteResource() 和sendCustomRequest().
QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, QHttpMultiPart *multiPart)
这是一个重载函数。
将multiPart 消息的内容发送到request 指定的目的地。
可用于通过 HTTP 发送 MIME 多部分消息。
另请参阅 QHttpMultiPart,QHttpPart, 和post() 。
QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, const QByteArray &data)
这是一个重载函数。
将data 字节数组的内容发送到request 指定的目的地。
[since 6.8]
QNetworkReply *QNetworkAccessManager::put(const QNetworkRequest &request, std::nullptr_t nptr)
这是一个重载函数。
发送request 指定的 PUT 请求(不含正文),并返回一个新的QNetworkReply 对象。
此函数在 Qt 6.8 中引入。
QNetworkRequest::RedirectPolicy QNetworkAccessManager::redirectPolicy() const
返回创建新请求时使用的重定向策略。
另请参阅 setRedirectPolicy() 和QNetworkRequest::RedirectPolicy 。
QNetworkReply *QNetworkAccessManager::sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = nullptr)
向由request 的 URL 标识的服务器发送自定义请求。
用户有责任向服务器发送符合 HTTP 规范的verb 。
除了通过get() 或post() 等提供的常用动词外,该方法还提供了发送其他动词的方法,例如发送 HTTP OPTIONS 命令。
如果data 不为空,data 设备中的内容将被上传到服务器;在这种情况下,数据必须开放供读取,并且必须保持有效,直到finished() 信号为该回复发出。
注: 此功能目前仅适用于 HTTP(S)。
另请参阅 get()、post()、put() 和deleteResource()。
QNetworkReply *QNetworkAccessManager::sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QHttpMultiPart *multiPart)
这是一个重载函数。
向request 的 URL 所标识的服务器发送自定义请求。
将multiPart 消息的内容发送到request 指定的目的地。
可用于发送自定义动词的 MIME 多部分信息。
另请参阅 QHttpMultiPart,QHttpPart, 和put() 。
QNetworkReply *QNetworkAccessManager::sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, const QByteArray &data)
这是一个重载函数。
将data 字节数组的内容发送到request 指定的目的地。
void QNetworkAccessManager::setAutoDeleteReplies(bool shouldAutoDelete)
启用或禁用自动删除QNetworkReplies 。
如果将shouldAutoDelete 设置为 true,则等同于在今后传递给QNetworkAccessManager 实例的所有QNetworkRequests 上将QNetworkRequest::AutoDeleteReplyOnFinishAttribute 属性设置为 true,除非QNetworkRequest 上已明确设置了该属性。
另请参阅 autoDeleteReplies 和QNetworkRequest::AutoDeleteReplyOnFinishAttribute 。
void QNetworkAccessManager::setCache(QAbstractNetworkCache *cache)
将管理器的网络缓存设置为指定的cache 。该缓存用于管理器分派的所有请求。
使用此函数可将网络缓存对象设置为实现附加功能的类,如将 cookie 保存为永久存储。
注意: QNetworkAccessManager 拥有cache 对象的所有权。
QNetworkAccessManager 默认情况下,Qt 没有设置缓存。Qt XML 提供了一个简单的磁盘缓存 ,可以使用。QNetworkDiskCache
另请参阅 cache() 和QNetworkRequest::CacheLoadControl 。
void QNetworkAccessManager::setCookieJar(QNetworkCookieJar *cookieJar)
将管理器的 cookie jar 设置为指定的cookieJar 。管理器分派的所有请求都会使用 cookie jar。
使用此函数可将 cookie jar 对象设置为实现附加功能的类,如将 cookie 保存为永久存储。
注意: QNetworkAccessManager 拥有cookieJar 对象的所有权。
如果cookieJar 与该QNetworkAccessManager 处于同一线程中,它将设置cookieJar 的父对象,以便在删除该对象时也删除 cookie jar。如果要在不同的QNetworkAccessManager 对象之间共享 cookie jar,可能需要在调用此函数后将 cookie jar 的父级设置为 0。
QNetworkAccessManager 在默认情况下,Cookie jar 不执行任何自己的 cookie 策略:它接受服务器发送的所有 cookie,只要这些 cookie 格式良好并符合最低安全要求(cookie 域与请求的相匹配,cookie 路径与请求的相匹配)。为了实施自己的安全策略,请覆盖 () 和 () 虚拟函数。 在检测到新 cookie 时会调用这些函数。QNetworkCookieJar::cookiesForUrl QNetworkCookieJar::setCookiesFromUrl QNetworkAccessManager
另请参见 cookieJar()、QNetworkCookieJar::cookiesForUrl() 和QNetworkCookieJar::setCookiesFromUrl()。
void QNetworkAccessManager::setProxy(const QNetworkProxy &proxy)
设置将来发送请求时使用的代理proxy 。这不会影响已发送的请求。如果代理请求身份验证,则会发出proxyAuthenticationRequired() 信号。
使用此函数设置的代理将用于QNetworkAccessManager 发送的所有请求。在某些情况下,可能需要根据发送请求的类型或目标主机选择不同的代理。如果是这种情况,您应该考虑使用setProxyFactory() 。
另请参阅 proxy() 和proxyAuthenticationRequired()。
void QNetworkAccessManager::setProxyFactory(QNetworkProxyFactory *factory)
设置该类的代理工厂为factory 。代理工厂用于确定特定请求要使用的更具体的代理列表,而不是尝试对所有请求使用相同的代理值。
QNetworkAccessManager 发送的所有查询都将使用QNetworkProxyQuery::UrlRequest 类型。
例如,代理工厂可以应用以下规则:
- 如果目标地址在本地网络中(例如,如果主机名不包含点,或者是组织范围内的 IP 地址),则返回QNetworkProxy::NoProxy
- 如果请求是 FTP,则返回 FTP 代理
- 如果请求是 HTTP 或 HTTPS,则返回 HTTP 代理
- 否则,返回 SOCKSv5 代理服务器
factory 对象的生命周期将由QNetworkAccessManager 管理。它将在必要时删除该对象。
注意: 如果使用setProxy() 设置了特定代理,则不会使用工厂代理。
另请参阅 proxyFactory(),setProxy() 和QNetworkProxyQuery 。
void QNetworkAccessManager::setRedirectPolicy(QNetworkRequest::RedirectPolicy policy)
将管理器的重定向策略设置为指定的policy 。该策略将影响管理器创建的所有后续请求。
使用此函数可在管理器级别启用或禁用 HTTP 重定向。
注意: 创建请求时,QNetworkRequest::RedirectAttributePolicy 的优先级最高,其次是管理器的策略。
默认值为QNetworkRequest::NoLessSafeRedirectPolicy 。我们鼓励依赖手动重定向处理的客户端在其代码中明确设置该策略。
另请参阅 redirectPolicy() 和QNetworkRequest::RedirectPolicy 。
void QNetworkAccessManager::setStrictTransportSecurityEnabled(bool enabled)
如果enabled 是true
,则QNetworkAccessManager 遵循 HTTP 严格传输安全策略(HSTS,RFC6797)。处理请求时,QNetworkAccessManager 会自动将 "http "方案替换为 "https",并为 HSTS 主机使用安全传输。如果明确设置,端口 80 将被端口 443 取代。
启用 HSTS 后,对于通过安全传输收到的每个包含 HSTS 标头的 HTTP 响应,QNetworkAccessManager 都会更新其 HSTS 缓存,要么记住具有有效策略的主机,要么删除已过期或禁用 HSTS 策略的主机。
另请参见 isStrictTransportSecurityEnabled().
void QNetworkAccessManager::setTransferTimeout(int timeout)
设置timeout 为传输超时(毫秒)。
另请参阅 setTransferTimeout(std::chrono::milliseconds),transferTimeout() 和transferTimeoutAsDuration()。
[since 6.7]
void QNetworkAccessManager::setTransferTimeout(std::chrono::milliseconds duration = QNetworkRequest::DefaultTransferTimeout)
设置超时duration ,以便在没有数据交换时中止传输。
如果在超时前没有传输任何字节,传输就会中止。0 表示不设置超时。如果未提供参数,超时时间为QNetworkRequest::DefaultTransferTimeout 。如果未调用此函数,超时时间将被禁用,其值为零。为已执行请求设置的特定非零超时会覆盖此值。这意味着,如果QNetworkAccessManager 启用了超时,则需要禁用超时才能执行无超时的请求。
此函数在 Qt 6.7 中引入。
另请参阅 transferTimeoutAsDuration()。
[signal]
void QNetworkAccessManager::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors)
如果 SSL/TLS 会话在设置过程中遇到错误,包括证书验证错误,就会发出该信号。errors 参数包含错误列表,reply 是遇到这些错误的QNetworkReply 。
为表明错误不是致命的,连接应继续进行,应从连接到此信号的插槽中调用QNetworkReply::ignoreSslErrors() 函数。如果不调用该函数,SSL 会话将在交换任何数据(包括 URL)之前被终止。
该信号可用于向用户显示错误信息,说明安全性可能受到影响,并显示 SSL 设置(请参阅 sslConfiguration() 获取)。如果用户在分析远程证书后决定继续,槽应调用 ignoreSslErrors()。
另请参阅 QSslSocket::sslErrors()、QNetworkReply::sslErrors()、QNetworkReply::sslConfiguration() 和QNetworkReply::ignoreSslErrors()。
QList<QHstsPolicy> QNetworkAccessManager::strictTransportSecurityHosts() const
返回 HTTP 严格传输安全策略列表。如果 HSTS 缓存是根据 "Strict-Transport-Security"(严格传输安全)响应头更新的,则该列表可能与最初通过addStrictTransportSecurityHosts() 设置的不同。
另请参阅 addStrictTransportSecurityHosts() 和QHstsPolicy 。
[virtual]
QStringList QNetworkAccessManager::supportedSchemes() const
列出访问管理器支持的所有 URL 方案。
重新实现此方法可在QNetworkAccessManager 子类中提供自己支持的方案。例如,当您的子类支持新协议时,就需要使用该方法。
int QNetworkAccessManager::transferTimeout() const
返回传输所使用的超时(毫秒)。
另请参阅 setTransferTimeout()。
[since 6.7]
std::chrono::milliseconds QNetworkAccessManager::transferTimeoutAsDuration() const
返回超时持续时间,超时后如果没有数据交换,传输将中止。
默认持续时间为零,即不使用超时。
此函数在 Qt 6.7 中引入。
另请参阅 setTransferTimeout(std::chrono::milliseconds)。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.