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握手期间遇到错误列表的函数

QList<QSslError> sslErrors() const;

已经重命名为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

以及那些名称不符合规范命名的枚举

在 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 公司的商标。所有其他商标均为各自所有者的财产。