八年了Qt6终于来啦!Qt Network模块发生重大更改

Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。赶快点击下载Qt最新试用版>>

点击获取更多文章教程

Qtitan组件集

  • QtitanRibbon| 下载试用: 遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart | 下载试用 : 是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。并且支持所有主要的桌面操作系统。
  • QtitanDataGrid| 下载试用 : 适用于Qt的商业化DataGrid 组件,使得表格数据可以直接面向终端用户完全集成了QtDesigner,极易适应其他相似开发环境,保证100%兼容Qt GUI。

在本文中,我们想告诉您Qt Network模块在Qt 6中的一些最新更新和更改以及一些潜在的发展。

QNetworkAccessBackend

QNetworkAccessBackend是一个抽象基类,用于与我们的缓存,文件和ftp后端接口。我们已经在Qt中使用QNetworkAccessBackend已有一段时间了,但是不可能以任何合理的方式在Qt网络外部使用。对于Qt 6,我们计划将ftp后端移出Qt Network,并作为插件单独分发。为此,我们使QNetworkAccessBackend在外部使用起来更加友好,并使QNetworkAccessManager能够在运行时加载这些插件。与我们的某些其他插件接口一样,它没有Qt本身具有的严格的向后兼容性保证,并且需要链接到QtNetworkPrivate才能使用它。

我们希望能够专门化各种后端的行为。例如,非网络后端不需要我们为目标URL准备代理列表。为此,我们添加了三个不同的枚举,每个枚举中都有一些值:

  • TargetType
  • 安全功能
  • IO功能

其中,仅需要“ TargetType”指定后端支持的目标是联网的还是本地的。

如果某些功能无法使用,则某些功能可能无法启用。一个这样的例子是IO功能“ZeroCopy”,它启用函数readPointer()和advanceReadPointer()。如果未启用,则不会调用这两个函数。拥有这个特性系统的主要思想是我们可以在不破坏任何现有代码的情况下进行这些改进。新代码必须选择使用新功能。不过,重申一下:我们不能保证网络访问后端插件与使用Qt的应用程序具有相同的向后兼容性。

要实现网络访问后端插件,您需要实现一个从QNetworkAccessBackendFactory继承的类。如果支持所请求的方案,则此类将完成创建后端的工作。您还需要创建一个从QNetworkAccessBackend继承的类,并覆盖所有纯虚函数以及'read()'或'readPointer()'和'advanceReadPointer()'(如果您的类支持'ZeroCopy'功能) 。对于现有用途,QNetworkAccessCacheBackend和QNetworkAccessFileBackend均已更新为使用新接口,尽管它们直接编译为Qt而不是作为插件分发。

通讯协定

在Qt 6中,我们放弃了SPDY支持。SPDY是具有开放规范的实验性协议,主要由Google开发。SPDY成为HTTP / 2协议的前身和原型。

在维持与HTTP / 1.1的兼容性(例如与方法,状态代码,URI和大多数标头字段)的兼容性的同时,HTTP / 2还添加了:

  • HTTP标头的数据压缩
  • 通过单个TCP连接多路复用多个请求
  • HTTP / 2服务器推送
  • 允许客户端和服务器选择HTTP / 2或HTTP / 1.1的协商机制

在Qt 6之前,必须通过设置以下属性之一来手动启用HTTP / 2协议:

  • QNetworkRequest :: Http2AllowedAttribute
  • QNetworkRequest :: Http2DirectAttribute,

例如:

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

对于“ Http2AllowedAttribute”,QNetworkAccessManager对“ https”方案使用应用程序层协议协商,对“ http”方案使用协议升级头“ h2c”。如果您事先知道服务器以所谓的“直接”模式支持HTTP / 2,而无需协议协商,则第二个属性很有用。

在Qt 6中,默认情况下启用HTTP / 2支持:这意味着属性'Http2AllowedAttribute'设置为'true'。如果无法协商HTTP / 2,则QNetworkAccessManager将回退到HTTP / 1.1。如果您的应用程序只能使用HTTP / 1.1,则可以为新的网络请求将属性'Http2AllowedAttribute'设置为'false':

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

此“默认启用”规则有一个例外:

QNetworkAccessManager::connectToHostEncrypted(host, port, configuration); 

使用此功能,应用程序可以预连接到服务器,而无需发送任何请求。如果我们要在这样的连接上启用HTTP / 2,则该连接对于希望使用HTTP / 1.1并通过使用请求属性禁用HTTP / 2的应用程序将毫无用处。通过在“配置”参数中设置所需的协议列表,可以显式启用HTTP / 2,例如:

auto tlsConfig = QSslConfiguration::defaultConfiguration(); tlsConfig.setAllowedNextProtocols({QSslConfiguration::ALPNProtocolHTTP2}); manager.connectToHostEncrypted(host, port, tlsConfig);

默认重定向策略已更改

另一个可能影响您的网络代码的更改是QNetworkAccessManager在Qt 6中使用的默认重定向策略。该策略API最初是在Qt 5中引入的,其思想是在Qt 6中切换为默认的自动重定向处理。

QNetworkAccessManager支持几种重定向策略,由枚举QNetworkRequest :: RedirectPolicy描述。这些政策是:

  • ManualRedirectPolicy
  • NoLessSafeRedirectPolicy
  • SameOriginRedirectPolicy
  • UserVerifiedRedirectPolicy

从Qt 6开始,QNetworkAccessManager发出请求时将使用的默认重定向策略是QNetworkRequest :: NoLessSafeRedirectPolicy(该策略禁止从“ https”重定向到“ http”)。

如果您有一个应用程序,该应用程序依赖于连接到QNetworkReply :: redirected()的插槽来处理重定向,则必须使用Qt 6将策略设置为QNetworkRequest :: ManualRedirectPolicy:

req.setAttribute(RedirectPolicyAttribute, ManualRedirectPolicy);

承载管理已删除

承载管理是对过去支持漫游和管理某些设备上的连接所需的机器的名称。它还可以选择连接到internet时使用的设备网络接口。今天,这种情况已不再,因为操作系统通常会自行处理漫游,并会自动选择最佳的网络接口来发送数据,通常不会为应用程序提供影响这些选择的方法(或不方便的方式)。
尽管QNetworkManager提供了api来选择要使用的接口或配置正在使用的接口,但这一新的现实意味着当前没有支持的平台为Qt提供可靠的方式来完成请求。在随后的Wifi请求被触发后,可能会导致网络中的各种Qt请求保持高流量,从而导致网络在短时间内保持高流量。
考虑到新的现实也使得承载管理在很大程度上是多余的,我们决定是时候让Qt网络的这一部分退役了。
一个仍然有用的特性是能够检查连接并获得连接更改的通知。到目前为止,在qt6.0中还没有找到替代品,尽管我们已经收集了一些用例,并希望在接下来的小版本中有一个替代品来替代这个功能。如果您有特定的用例,您希望看到涵盖的内容,或者您想跟踪这个任务的进度,那么请转到QTBUG-86966。

QSslSocket

在Qt 6中,QSslSocket接收了一个附加的API,提供有关作为TLS协议的一部分接收或发送的警报消息的信息。:以下面为例:

  • QSsl::AlertLevel describes how serious problem is
  • QSsl::AlertType indicates the type of problem

QSslSocket中有两个新信号:

  • QSslSocket :: alertSent()
  • QSslSocket :: alertReceived()

如果可能,这些信号还会报告问题的文本描述(如果由TLS库提供)。

与TLS握手相关的另一项更改是能够在握手仍在进行时尽早报告握手期间遇到的错误的功能。这些错误直接从验证回调中报告。QSslConfiguration有一个新的getter和setter:

  • bool QSslConfiguration :: handshakeMustInterruptOnError()const;
  • void QSslConfiguration :: setHandshakeMustInterruptOnError()const;

QSslSocket有一个新信号:

  • void handshakeInterruptedOnError();

和一个错误的函数必须忽略:

  • void continueInterruptedHandshake();

如果不忽略错误,则底层TLS库将向对等方发送警报消息。

对于使用QNetworkAccessManager的应用程序,此API有点底层,并且没有太大的意义。但是,如果直接使用QSslSocket,则对于调试目的或实现某些错误或警告处理逻辑时,它可能非常方便。目前,此更改适用于我们的OpenSSL后端;我们使用的其他TLS库没有必需的API或未提供我们所需的完整信息。

TLS 1.3及更高版本

好吧,这一部分并不是关于qt6已经具备的。这也是关于未来可能的发展。到目前为止,qt6支持TLS协议的最新版本,即1.3,这要归功于我们的OpenSSL后端(qt5也支持tls1.3)。我们正致力于在Schannel后端启用tls1.3。不幸的是,SecureTransport被Apple弃用,没有可用的TLS库作为替代,只有一些构建在BoringSSL之上的更高级别的框架(请注意这一点的讽刺!)。这意味着,对于我们的达尔文用户,我们将在未来提供另一种选择。以QNetworkAccessManager为例,在苹果的NSUrlSession等类之上实现的一个新的QNetworkAccessBackend非常方便(包括tls1.3和实验性的HTTP/3支持)。

Qt最新教程资讯:(持续更新……)

  • Qt正式发布,官方功能解析!
  •  

    什么是Ribbon UI界面?如何运用Qt进行开发
  • 福利!100多条Qt开发常见问题及解决方法汇总!很长建议先收藏

  • Qt6最新资讯:据说QMeta + QVariant有重大功能更新
  • C++跨平台开发框架Qt时隔八年迎来重磅更新!现推出史上最全新功能模块合集介绍
  • Qt界面开发组件Qtitan入门教程:如何安装配置Qt项目文件
  • Qt for MCUs 1.5 发布啦!改进API,可用性和稳定性得到增强
  • 适用于MCU 1.4的Qt发布:解决嵌入式系统常见问题

如果这篇文章没能满足你的需求、点击获取更多文章教程!现在立刻下载Qt免费试用吧!

 

你可能感兴趣的:(C++界面开发框架Qt最新资讯,qt,前端)