Qt网络变更
Qt 6是一次有意为之的努力,旨在使框架更高效且易于使用。
我们尝试在每个版本中保持所有公共API的二进制和源代码兼容性。但是,为了使Qt成为更好的框架,一些变更不可避免。
在这个主题中,我们总结了Qt网络中的这些变更,并提供了处理它们的指南。
API变更
模糊的名称重载
删除了几个模糊的重载函数。在QAbstractSocket及其后继者(《QTcpSocket》、《QUdpSocket》、《QLocalSocket》和《QSslSocket》),以及在《QNetworkReply》中),error()信号被替换为errorOccurred()。例如
connect(socket, qOverload<QAbstractSocket::SocketError>(&QAbstractSocket::error), this, &SomeClass::errorSlot);
必须相应地更改为
connect(socket, &QAbstractSocket::errorOccurred, this, &SomeClass::errorSlot);
在《QSslSocket》中,返回TLS握手期间遇到错误列表的函数
已经重命名为sslHandshakeErrors()
const auto tlsErrors = socket.sslHandshakeErrors();
载体管理被删除
在Qt 6中删除了类QNetworkConfiguration和QNetworkConfigurationManager。因此,以下《QNetworkAccessManager》的成员函数也已删除
void setConfiguration(const QNetworkConfiguration &config); QNetworkConfiguration configuration() const; QNetworkConfiguration activeConfiguration() const; void setNetworkAccessible(NetworkAccessibility accessible); NetworkAccessibility networkAccessible() const; void networkSessionConnected();
QNetworkInformation最初在Qt 6.1中引入,旨在替换载体管理API的一些方面。通过为主要操作系统通知的网络更改提供统一API来工作。
在Qt 6.1中引入的《QNetworkInformation::reachability》替换了《QNetworkAccessManager::networkAccessible》函数,同时添加了更多有关网络可达性的详细信息。有关更多详细信息,请参阅其文档。
在Qt 6.2中,《QNetworkInformation》获得了检测封闭门户的能力。
在Qt 6.3中,《QNetworkInformation》获得了《QNetworkInformation::transportMedium()》和《QNetworkInformation::isMetered()》。
删除枚举
在《QtNetwork》中删除了几个枚举。这包括已不再支持的协议和功能常量
- QSsl::SslV2;
- QSsl::SslV3;
- QSsl::TlsV1SslV3;
- QNetworkRequest::SpdyAllowedAttribute;
- QNetworkRequest::SpdyWasUsedAttribute;
- QNetworkAccessManager::UnknownAccessibility;
- QNetworkAccessManager::NotAccessible;
- QNetworkAccessManager::Accessible
以及那些名称不符合规范命名的枚举
- QSsl::TlsV1(《QSsl::TlsV1_0”是正确的名称);
- QNetworkRequest::HTTP2AllowedAttribute (使用《QNetworkRequest::Http2AllowedAttribute》);
- QNetworkRequest::HTTP2WasUsedAttribute (使用 QNetworkRequest::Http2WasUsedAttribute)。
在 Qt 6 中已移除 QNetworkRequest::FollowRedirectsAttribute,请参阅下方的关于重定向处理的章节。
配置 QSslSocket
以下已弃用的函数在 Qt 6 中被移除
QList<QSslCipher> ciphers() const; void setCiphers(const QList<QSslCipher> &ciphers); void setCiphers(const QString &ciphers); static void setDefaultCiphers(const QList<QSslCipher> &ciphers); static QList<QSslCipher> defaultCiphers(); static QList<QSslCipher> supportedCiphers(); QList<QSslCipher> ciphers() const; void setCiphers(const QList<QSslCipher> &ciphers); void setCiphers(const QString &ciphers); static void setDefaultCiphers(const QList<QSslCipher> &ciphers); static QList<QSslCipher> defaultCiphers(); static QList<QSslCipher> supportedCiphers(); bool addCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString); void addCaCertificate(const QSslCertificate &certificate); void addCaCertificates(const QList<QSslCertificate> &certificates); void setCaCertificates(const QList<QSslCertificate> &certificates); QList<QSslCertificate> caCertificates() const; static bool addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString); static void addDefaultCaCertificate(const QSslCertificate &certificate); static void addDefaultCaCertificates(const QList<QSslCertificate> &certificates); static void setDefaultCaCertificates(const QList<QSslCertificate> &certificates); static QList<QSslCertificate> defaultCaCertificates(); static QList<QSslCertificate> systemCaCertificates();
使用 QSslConfiguration 和其成员函数来设置这些参数,例如。
auto sslConfiguration = QSslConfiguration::defaultConfiguration(); sslConfiguration.setCiphers("ECDHE-ECDSA-AES256-SHA384"); // Set other parameters here ... socket.setSslConfiguration(sslConfiguration);
QNetworkAccessManager 默认行为的变化
重定向策略
在 Qt 6 中,默认的重定向策略从手动更改为由 QNetworkRequest::NoLessSafeRedirectPolicy。如果您的应用程序依赖于手动重定向处理(将其槽连接到 QNetworkReply::redirected 信号),您必须在创建请求时显式设置此策略
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::ManualRedirectPolicy);
HTTP/2 默认启用
在 Qt 6 中,QNetworkAccessManager 默认启用 HTTP/2 协议。根据方案("https" 或 "http"),QNetworkAccessManager 将使用应用层协议协商 TLS 扩展或 "协议升级" HTTP 标头来协商 HTTP/2。如果不能协商 HTTP/2,访问管理器将回退到使用 HTTP/1.1。如果您的应用程序只能使用 HTTP/1.1,您必须在新的请求中手动禁用 HTTP/2
request.setAttribute(QNetworkRequest::Http2AllowedAttribute, false);
QNetworkAccessManager 现在保护免受归档炸弹攻击
从 Qt 6.2 开始,QNetworkAccessManager 将保护免受压缩文件错误地解压缩成大于压缩形式的文件,通过如果解压缩率超过某个阈值则报告错误来处理回复。此检查仅应用于大于一定大小的文件,可以通过调用 QNetworkRequest::setDecompressedSafetyCheckThreshold() 进行自定义(或通过传递 -1 禁用)。
© 2024 Qt 公司有限。此处包含的文档贡献是各自所有者的版权。此处提供的文档根据自由软件基金会的 GNU 自由文档许可协议版本 1.3 的条款提供。Qt 及其相应的商标是芬兰及/或其他国家 Qt 公司的商标。所有其他商标均为各自所有者的财产。