前言
本文重点解决的是,按照官网学习路径学习Tcp模块内容时,越看越混乱的问题。仿照官网案例,书写代码时,产生的各种疑惑。比如,类与类之间的关系,各种配置信息究竟有多少,为什么越写越混乱。那些官方文档中并没有提及的令人迷惑的地方。
本篇文章适合在看RCP官方教程之前,做辅助铺垫用。以便于更容易理解其代码书写原因,做到写一遍之后就不用再参照文档,自己自然就知道怎么写了。官方教程连接如下
对于文章中有些图片由于太大展示模糊,请在附件中下载,便于清晰阅览!
华为开发者学堂
好接下来讲讲这个RCP模块。
正文
Rcp我之前知之甚少。查了一下才知道这个协议很适合分布式系统的实现,是分布式系统实现高效通讯的重要工具。并且是官方主推替代http模块的工具。
原因是,Rcp可以实现http能实现的能力,而且能做到http做不到事, 比Http更好用,具备更多的功能。
RCP提供的能力与设置,涵盖了整个Http所有环节
- 发起网络请求
- 多表单提交
- 双向证书校验
- DNS灵活的解析方式(系统,自定义)
- 数据发送数据传输与数据响应拦截
- 捕获有关http发送流,响应流的信息
RCP请求过程
首先先对请求过程有大致的了解,接下来我们重点介绍的,RCP代码中, 请求配置参数,几乎涵盖每一个细节的配置方式。大家看到配置信息的时候,能回顾到大致会影响到哪些环节即可。
RCP框架简介
- RCP全称 Remote Communication Platform。其通过对HTTP协议的NAPI封装,提供基于场景化的声明式开发范式API接口,使开发人员无需处理低级别的HTTP细节,降低代码量并提升开发效率。
- 提供基于会话的多线程模型,并动态调整和部署HTTP参数。
- 相比于ohos.net.http模块。RCP在并发场景下进行了性能优化,使数据传输更快,性能更强。
代码实现及代码使用上的关系梳理
Session
Session指的是会话,它主要用于管理一组相关的请求(Request)与响应(Response)。 也就是跟请求是1vn的关系。
它管理的是很多请求,这点需要着重理解下。同时Session内部管理了一组TCP连接,是一组!
- 允许的最大并发TCP连接数,默认值为6条, 允许设置的最大的数量是2147483647条。
- Session允许多个TCP连接同时连接,最大活跃条数支持量为64条, 允许设置的最大值也是2147483647条。
- Session内部像Http一样实现了底层对TCP连接的复用。避免TCP连接频繁所带来的客户端和服务端资源浪费。
- 正因为上述两个原因,它才能管理一组的相关请求与响应的。所以,一个Session的生命周期,可以很长。绝对要长过一条http请求。
一个应用最多能创建16个Session。 超出范围会报错。
Request 与 Response
Request指的是Http请求对象。用于构造http请求的信息,通过Session发送出去,从而获得对应的数据响应(Response)
关系总结
Session是一个生命周期略长的会话,在会话期间,可以发送多条Request,从而获取Response。
所以他们的使用规则在代码上的表现为:
// 首先先创建一个Session实例,此为最简单的实例创建方式。商业代码中会很复杂。
// 此session之后会不断地被用来发送请求。与request是1vn的关系
const session = rcp.createSession(sessionCfg)// 创建一个request实例, request实例会有很多参数,之后我们会涉及学习。
let req = new rcp.Request('/test/post', 'POST', rcpHeader, multiForm, cookies, transferRange, configuration)// 发送
session.fetch(req).then((response) => {hilog.info(this.LOG_DOMAIN, this.LOG_TAG, "rcp request fetch success! response=" + JSON.stringify(response))}).catch((err : BusinessError) => {hilog.error(this.LOG_DOMAIN, this.LOG_TAG, "rcp request fetch error! err=" + JSON.stringify(err))
})
最粗略的调用关系就是这些。
有关于RCP中的各项Configuration
在商用代码中的调用,远不如上一节中的代码那么简单。要确保数据的传输绝对安全,也要确保数据的传输速度很快,很高效。另外,对于每一条请求还有一些统计上的需求,比如响应延迟时常,正确回复率等等,这是服务端伙伴们向上汇报的重要数据。总之啊,商用代码要加一些配置才能确保数据传输的安全和高效,这里讲的配置就是Configuration。
Session实例中的配置-SessionConfiguration
上文已经讲到了,Session负责的是n多条TCP连接,掌管n多个http请求响应过程。所以Session的配置有以下特点
- 配置内容偏公共偏基础,以便于每一条请求响应中可以用到
- 有一些不乏便于管理的配置项
createSession函数的声明为:
export function createSession(sessionConfiguration?: SessionConfiguration): Session;
在使用的时候我们直接用rcp调用即可。传入的参数就是配置参数 SessionConfiguration。
const session = rcp.createSession(sessionCfg) // sessionCfg为 SessionConfiguration对象, 管配置的
SessionConfiguration
SessionConfiguration是一个很庞大的配置类,其下聚合了很多方面的配置。这些配置单看源码的话,非常容易混淆,使用的时候需要不断的查源码看调用方式。比较麻烦。 另外就是。config的存在,便于我们按图索骥,大约能估摸出来这个RCP具体实现了什么能力。
我画了一张图,便于查看持有关系,以及分类脉络便于记忆。由于图片太大,本文附件中会包含一份整理完的原图。
Request实例中的配置
Request实例的初始化方法是:
let req = new rcp.Request('/test/post', 'POST', rcpHeader, multiForm, cookies, transferRange, configuration)
这个request初始化的时候,是需要很多参数的,我们这个章节讲的就是配置,只拿最后一个参数讲,就是Request的专有配置, 类型为 Configuration。
constructor(url: URLOrString, method?: HttpMethod, headers?: RequestHeaders, content?: RequestContent, cookies?: RequestCookies, transferRange?: TransferRange | TransferRange[], configuration?: Configuration);
这个Configuration与Session对象创建时传入的SessionConfiguration中的 requestConfiguration属性,类型是一样的。也就是Session间接持有了一个Configuration, 而Request直接持有了 Configuration, 与此同时还存在一些配置项,如Header, Cookies 都有可能在整个系统中出现两份!
接下来明了了,也就是如图所示,Session创建实例的时候传入的配置信息,和Request创建实例的时候传入的配置信息,有一部分是冲突的!存在冲突的可能!
session组件,Request组件同时设置configuration,哪个会生效
既然代码设置的时候,像上一章讲的存在两份,那么必然会存在冲突问题。RCP模块中对于这种冲突的处理流程如下图所示:
Configuration以request组件中的参数为准, 如果request中没有设置,就以session为准。
Response对象
对于Response对象,这个就是请求之后返回来的响应对象。对于这个对象的了解,侧重点就是其数据结构。它里面的属性很多都是只读的。我们知道什么属性存什么数据就行了。
我将Response也画了一个图,以便于有大致的印象。
铺垫好这些内容之后,请大家愉快的学习官方文档吧:
华为开发者学堂