鸿蒙开发:远场通信服务rcp会话问题

简介: 总体来说,问题倒不是很大,解决起来也不是很麻烦,所以啊,老铁们,在实际的开发中,对于一些官方文档,还是建议多看,这样可以提前避免后续的不必要麻烦。

前言


本文基于Api13。


之前开源过一个基于rcp,也就是基于Remote Communication Kit(远场通信服务)的网络库,自己在测试的时候没有问题,但是开源之后,就暴露了很多的问题,像post请求类型不对问题,多次请求之后就无法请求问题,header在拦截器中无法获取等等问题,这些问题的出现,主要在于未细心查看官方文档,未全面自测等产生的,为了做到日后避免再出错,索性把这些问题一一记录下来,希望可以帮助到一些朋友。


问题


一开始封装好之后,自己也做了一些测试,无问题之后就开源了,可是过了一些时间后,就接到了一个奇葩问题,说封装的这个网络库,在进行了多次请求之后,就无法请求问题。


当时我都差异了,无法请求是什么问题,为什么会多次请求之后才会报出这样的问题?带着这个疑问,我运行了自己的Demo,开始测试。


无论是get请求还是post请求,还是其他请求方式,我都进行了测试,在尝试多次之后,没发现问题啊,请求都是正常的,数据也能正常返回,难道,这个小伙子在耍我?


不太可能,谁会拿着问题在耍人,再说了能提出问题的人,绝对是忠实的粉丝,可是为什么,他的问题,我复现不出来呢?可能我的请求不够多?


于是,我就开始了一次又一次的请求,盯着日志控制台,一次,两次,直到第十七次,结果未返回,也未报错,这时,我才惊讶的发现,果然有这个问题,差点冤枉了好人。



不应该啊,我都是按照官方的案例进行封装的,难道是官方的问题,于是我重新查看了官方文档,随便找了一个案例,进行运行。


这里接口就不写了,大家随便找一个接口就行。


private tempNumber: number = 0
  private doHttp() {
    // 定义sessionConfig对象
    const sessionConfig: rcp.SessionConfiguration = {
      requestConfiguration: {
        transfer: {
          autoRedirect: true,
          timeout: {
            connectMs: 10000,
            transferMs: 10000
          }
        },
        tracing: {
          verbose: true
        }
      }
    }
    // 创建通信会话对象
    const session = rcp.createSession(sessionConfig)
    // 定义请求对象rep
    let req = new rcp.Request('xxx', 'GET')
    // 发起请求
    this.tempNumber++
    session.fetch(req).then((response) => {
      console.log("===第"+this.tempNumber+"次请求:" + response.toString())
    }).catch((err: BusinessError) => {
      console.log("=======ERROR:" + err.message)
    })
  }


运行之后,果然也会出现以上的问题,查看日志控制台后,发现,超过16次,直接会下面的异常错误信息:



这我也分析不出来啊,当我正要给官方提工单的时候,一个说明映入了眼帘,rcp目前只能创建16个session实例,这也就是为什么,前16次请求都没问题的原因。



如何解决


怎么着?只能让发起16次请求呗,这显然不合理啊,一个项目也不止16个请求啊,仔细再回头看下官方案例,好像发起请求也不是通过session啊,而是最终通过Request,好像是我误解了官方,好尴尬。


解决也很简单,那就是复用session,并提供可重新创建session的功能,这样就可以解决每次创建session造成的大于16次问题。


还是以上的代码案例,我们简单做下处理:


private tempNumber: number = 0
private mSession?: rcp.Session = undefined
  private doHttp() {
    // 定义sessionConfig对象
    const sessionConfig: rcp.SessionConfiguration = {
      requestConfiguration: {
        transfer: {
          autoRedirect: true,
          timeout: {
            connectMs: 10000,
            transferMs: 10000
          }
        },
        tracing: {
          verbose: true
        }
      }
    }
    // 创建通信会话对象
    if (this.mSession == undefined) {
      this.mSession = rcp.createSession(sessionConfig)
    }
    // 定义请求对象rep
    let req = new rcp.Request('xxx', 'GET')
    // 发起请求
    this.tempNumber++
    this.mSession.fetch(req).then((response) => {
      console.log("===第" + this.tempNumber + "次请求:" + response.toString())
    }).catch((err: BusinessError) => {
      console.log("=======ERROR:" + err.message)
    })
  }


可以看到,就不会有超过16次的问题了。


注意事项


在实际的网络库封装中,我们不能以简单的方式进行处理,毕竟考虑的问题有很多,比如,我需要重新创建会话怎么办?重新创建了会话,如何保证,某些请求使用第一个会话,某些请求使用第二个会话,这些问题都是必须要考虑的。


建议以map集合的方式,存储当前创建的会话,给每一个新的会话都标识一个唯一的key,这样就可以区分请求使用指定会话问题。


至于是否要重新创建会话,通过传递参数即可。


相关总结


总体来说,问题倒不是很大,解决起来也不是很麻烦,所以啊,老铁们,在实际的开发中,对于一些官方文档,还是建议多看,这样可以提前避免后续的不必要麻烦。


还有一种比较消耗资源的方式解决这个问题,那就是每次请求之后,直接关闭会话,但是一个项目中会有N个请求,每次执行请求都要创建关闭……,当然了这个自己衡量。

目录
打赏
0
7
7
0
184
分享
相关文章
uniapp 极速上手鸿蒙开发
uniapp 自版本 `4.28.2024092502` 起支持鸿蒙应用开发,现版本 `4.36.2024112817` 同时支持鸿蒙应用和元服务开发。本文介绍使用 HBuilderX 4.24+ 和 DevEco Studio 进行环境配置、项目创建及运行的详细步骤,涵盖从 AGC 平台新建项目、配置证书到最终运行项目的全流程,帮助开发者快速上手鸿蒙开发。注意:HBuilderX 4.31+ 构建的鸿蒙运行包不支持 x86_64 平台,需使用真机调试。
122 85
uniapp 极速上手鸿蒙开发
鸿蒙开发:什么是ArkTs?
本小结主要简单介绍了ArkTs语言的相关知识,都是一些概念性质的内容,大家作为一个了解即可
89 60
|
7天前
|
鸿蒙开发:自定义一个搜索模版
这样的一个模版,可以简单的分为,三个部分,分别是上边的搜索框,中间的历史搜索和下边的热门搜索,搜索框,我们直接可以使用系统的组件Search,历史搜索,由于是内容不一的搜索的内容,这里使用弹性布局Flex,下边的热门搜索,条目规格一致,这里我们直接使用Grid网格组件。
50 23
鸿蒙开发:自定义一个搜索模版
鸿蒙开发:ArkTs语言注释
关于注释,有一点需要注意,那就是,注释,不会被编译器或解释器执行,而本小节的重点并不是简单的教大家注释如何去写,而是在实际的项目中,我们能够真正的把注释投入到实际的开发中。
51 18
鸿蒙开发:ArkTs语言注释
鸿蒙开发:权限管理之权限声明
本文,主要简单概述了为什么要有权限管理,以及权限管理的声明原则,这些都是基本的概念内容,大家做为了解即可,重要的是怎么声明权限,在什么位置声明权限,这一点需要掌握。
49 16
鸿蒙开发:权限管理之权限声明
鸿蒙开发:console日志输出
针对初学者而言,大家只需要掌握住日志打印即可,等到了鸿蒙应用开发的时候,还有一个鸿蒙原生的打印工具HiLog,到时,我们也会详细的去讲述,也会针对HiLog,封装一个通用的工具类。
39 11
鸿蒙开发:console日志输出
|
6天前
|
鸿蒙开发:了解应用级配置信息
在实际的开发中,如果有共用的资源,建议大家都放到AppScope目录下,对于一些应用级别的信息,比如应用的名字,还有应用的图标,虽然说在Moulde下也可以配置,但是为了更方便的管理,这里比较推荐以AppScope目录下的app.json5为主,当然了,只是推荐,实际当中,两者都可以实现,大家选择其中一种方式即可。
38 12
鸿蒙开发:了解应用级配置信息
鸿蒙开发:ArkTs数据类型
最后一点是,ArkTS不支持any和unknown类型,需要显式指定具体类型,否则会报异常,具体原因是,这是ArkTS的特性之一,那就是使用静态类型;如果程序采用静态类型,即所有类型在编译时都是已知的,那么开发者就能够容易理解代码中使用了哪些数据结构。同时,由于所有类型在程序实际运行前都是已知的,编译器可以提前验证代码的正确性,从而可以减少运行时的类型检查,有助于提升性能。
鸿蒙开发:ArkTs数据类型
鸿蒙开发:权限授权封装
关于权限,算上本章内容已经阐述了四个章节了,从相关的概念到,权限管理的授权方式,再到申请权限,直至最后的权限工具类封装,基本上涵盖了七七八八,希望可以帮助到大家。
鸿蒙开发:权限授权封装
鸿蒙开发:权限管理之授权方式
在实际的应用开发中,合理选择 system_grant和user_grant是平衡功能实现与用户隐私的关键,system_grant 适用于基础功能,简化开发流程;user_grant 用于敏感操作,需重视用户体验和隐私合规。
鸿蒙开发:权限管理之授权方式

热门文章

最新文章

  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    38
  • 2
    uniapp 极速上手鸿蒙开发
    16
  • 3
    【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
    26
  • 4
    EMAS 性能分析全面适配HarmonyOS NEXT,开启原生应用性能优化新纪元
    35
  • 5
    鸿蒙开发:了解@Builder装饰器
    17
  • 6
    鸿蒙开发:wrapBuilder传递参数
    8
  • 7
    鸿蒙web加载本地网页资源异常
    12
  • 8
    【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
    13
  • 9
    鸿蒙H5离线包技术分享
    5
  • 10
    【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
    10
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等