Qt Network 的变化

Qt 6 是努力使框架更高效,且更易于使用的结果。

为兼容每个发行的所有公共 API,我们试着维护二进制和源代码。但是,为使 Qt 成为更优框架,一些改变是不可避免的。

本主题汇总了 Qt Network 的这些变化,并提供处理它们的指导。

API 变化

歧义名称重载

移除了几个有歧义的重载函数。以 errorOccurred() 替换 error() 信号在 QAbstractSocket 及其继承者 ( QTcpSocket , QUdpSocket , QLocalSocket ,和 QSslSocket ),和在 QNetworkReply 。代码譬如:

connect(socket, qOverload<QAbstractSocket::SocketError>(&QAbstractSocket::error),
        this, &SomeClass::errorSlot);
					

因此必须改为:

connect(socket, &QAbstractSocket::errorOccurred, this, &SomeClass::errorSlot);
					

QSslSocket , the function that returns a list of errors encountered during the TLS handshake:

QList<QSslError> sslErrors() const;
					

被重命名为 sslHandshakeErrors():

const auto tlsErrors = socket.sslHandshakeErrors();
					

移除承载管理

类 QNetworkConfiguration 和 QNetworkConfigurationManager 在 Qt 6 被移除。因此,下列成员函数对于 QNetworkAccessManager 也被移除:

void setConfiguration(const QNetworkConfiguration &config);
QNetworkConfiguration configuration() const;
QNetworkConfiguration activeConfiguration() const;
void setNetworkAccessible(NetworkAccessibility accessible);
NetworkAccessibility networkAccessible() const;
void networkSessionConnected();
					

QNetworkInformation , initially introduced in Qt 6.1, aims to replace some aspects of the bearer management API. It works by providing a unified API which subscribes to changes to the network as notified by the operating system.

QNetworkInformation::reachability (), introduced in Qt 6.1, replaces the QNetworkAccessManager::networkAccessible() function, while adding more detailed information about the reachability of the network. See its documentation for more details.

在 Qt 6.2 QNetworkInformation 获得检测俘虏传送门的能力。

在 Qt 6.3 QNetworkInformation 获得 QNetworkInformation::transportMedium () 和 QNetworkInformation::isMetered ().

被删除的枚举器

几个枚举器被移除在 QtNetwork . This includes constants for no longer supported protocols and functionality:

  • QSsl::SslV2;
  • QSsl::SslV3;
  • QSsl::TlsV1SslV3;
  • QNetworkRequest::SpdyAllowedAttribute;
  • QNetworkRequest::SpdyWasUsedAttribute;
  • QNetworkAccessManager::UnknownAccessibility;
  • QNetworkAccessManager::NotAccessible;
  • QNetworkAccessManager::Accessible

and enumerators whose names did not follow proper naming conventions:

QNetworkRequest::FollowRedirectsAttribute 在 Qt 6 被移除,见 处理重定向的有关章节 下文。

配置 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 and its member functions to set these parameters, e.g.:

auto sslConfiguration = QSslConfiguration::defaultConfiguration();
sslConfiguration.setCiphers("ECDHE-ECDSA-AES256-SHA384");
// Set other parameters here ...
socket.setSslConfiguration(sslConfiguration);
					

QNetworkAccessManager 默认行为的变化

重定向策略

在 Qt 6,默认重定向策略已从手动改为 QNetworkRequest::NoLessSafeRedirectPolicy . If your application relies on manual redirect handling (it connects its slot to the QNetworkReply::redirected signal), you have to explicitly set this policy when creating a request:

request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::ManualRedirectPolicy);
					

HTTP/2 默认是启用的若它被此代理使用。

在 Qt 6 中 QNetworkAccessManager 默认启用 HTTP/2 协议。从属方案 (https 或 http), QNetworkAccessManager will use the Application Layer Protocol Negotiation TLS extension or "protocol upgrade" HTTP header to negotiate HTTP/2. If HTTP/2 cannot be negotiated, the access manager will fall back to using HTTP/1.1. If your application can only use HTTP/1.1, you have to disable HTTP/2 manually on a new request:

request.setAttribute(QNetworkRequest::Http2AllowedAttribute, false);
					

QNetworkAccessManager 现在守卫针对存档炸弹

从 Qt 6.2 开始 QNetworkAccessManager will guard against compressed files that decompress to files which are much larger than their compressed form by erroring out the reply if the decompression ratio exceeds a certain threshold. This check is only applied to files larger than a certain size, which can be customized (or disabled by passing -1) by calling QNetworkRequest::setDecompressedSafetyCheckThreshold ().