前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >鸿蒙开发:远场通信服务rcp会话问题

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

原创
作者头像
程序员一鸣
发布于 2025-03-19 01:31:41
发布于 2025-03-19 01:31:41
3200
代码可运行
举报
运行总次数:0
代码可运行

前言

本文基于Api13。

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

问题

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

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

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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次问题。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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个请求,每次执行请求都要创建关闭……,当然了这个自己衡量。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
鸿蒙开发,远场通信服务rcp拦截器问题
上篇文章,简单的对rcp中的会话问题做了概述,本篇文章,我们聊一聊rcp中的拦截器问题,按照正常开发,其实拦截器中也不存在问题的,毕竟都是很官方的开发方式,但是在结合了创建会话之后,这个问题就会暴露出来。
程序员一鸣
2025/03/20
160
鸿蒙开发,远场通信服务rcp拦截器问题
HarmonyOS 开发实践 —— 基于rcp的网络请求能力
rcp模块提供HTTP数据请求功能,请求性能如接口的易用性、性能、功耗方面,对比Network Kit HTTP网络API,rcp采用面向对象和场景的设计,API使用更简单、更灵活,满足不同场景的使用需求,具备更好的扩展性和更优的性能。支持如场景化网络API、网络代理、自定义DNS解析、自定义证书校验、服务器身份校验等特性。
小帅聊鸿蒙
2024/11/22
2010
HarmonyOS 开发实践 —— 基于rcp的网络请求能力
HarmonyOS 开发实践 —— 网络重定向在HarmonyOS上的场景及解决方案
在应用开发时会碰到页面自动跳转的重定向现象,根据业务需求,需要对重定向进行一些判断和处理。
小帅聊鸿蒙
2024/12/16
1430
HarmonyOS 开发实践 —— 网络重定向在HarmonyOS上的场景及解决方案
鸿蒙HarmonyOS AVSession开发指南~
会话接入端常用接口如下表所示。接口返回值有两种返回形式:callback和promise,下表中为callback形式接口,promise和callback只是返回值方式不一样,功能相同。
小帅聊鸿蒙
2024/07/17
1850
鸿蒙HarmonyOS  AVSession开发指南~
鸿蒙next版开发:相机开发-会话管理(ArkTS)
在HarmonyOS 5.0中,ArkTS提供了一套完整的API来管理相机会话,这对于开发相机应用来说至关重要。本文将详细介绍如何在ArkTS中进行相机会话管理,并提供代码示例进行详细解读。
淼学派对
2024/11/13
1030
鸿蒙开发学习:定位相关知识(Locationkit)
LocationKit提供了定位服务、地理围栏、地理编码、逆地理编码和国家码等功能。
钟子翔
2024/12/24
810
基于鸿蒙OS开发API接口设计:如何优化数据传输与请求效率
在鸿蒙应用开发中,关于应用的优化,也是大前端开发中的通用性能优化之一的,就是数据传输的精简,而且这也是提升效率的关键。那么作为鸿蒙OS应用开发者,我们可以通过下面的方式来优化数据传输,这里通过三个方面来分享:
三掌柜
2024/11/18
1680
基于鸿蒙OS开发API接口设计:如何优化数据传输与请求效率
鸿蒙应用开发从入门到入行 - 篇7:http网络请求
导读:在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用、ArkUI里的基础组件,并通过制作一个简单界面掌握使用
猫林老师
2024/12/23
1630
鸿蒙应用开发从入门到入行 - 篇7:http网络请求
鸿蒙开发:文本合成语音
Android开发的同学都知道,在Android当中,实现一段文字合成语音播放,可以使用系统提供的对象TextToSpeech来很快的实现,如果不用系统自带的,也可以使用三方提供的,比如讯飞的语音合成等等,总之,实现起来多种多样,那么,在鸿蒙当中,如何实现根据指定的文本进行合成语音合成播放呢,其实也是非常的简单,因为鸿蒙当中也有textToSpeech。
程序员一鸣
2024/12/31
1590
鸿蒙开发:文本合成语音
分布式Session解决方案
Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。
java思维导图
2019/05/21
6130
Todo List: 多人协同处理待办事项,权限管理 – 第七章(第1节)
Todo List项目到这里已经到了非常重要的部分,涉及到用户部分。权限,多人协同操作等,都是非常重要,且复杂的地方,所以这里分为几个章节,一步一步的完成。
Javanx
2019/09/04
1.5K0
Todo List: 多人协同处理待办事项,权限管理 – 第七章(第1节)
Vue笔记:封装 axios 为插件使用
自从Vue2.0推荐大家使用 axios 开始,axios 被越来越多的人所了解。使用axios发起一个请求对大家来说是比较简单的事情,但是axios没有进行封装复用,项目越来越大,引起的代码冗余。就会非常麻烦的一件事。所以本文会详细的跟大家介绍,如何封装请求,并且在项目组件中复用请求。有需要的朋友可以做一下参考。
朝雨忆轻尘
2019/06/19
2K0
Vue笔记:封装 axios 为插件使用
鸿蒙开发:切换至基于rcp的网络请求
之前开源了一个基于http封装的网络请求,具体的可以查看之前的文章,奈何随着Api的升级,目前又推荐了另一个Api形式进行网络通信,也就是基于Remote Communication Kit(远场通信服务),只能感叹一声,Api变化的真实迅速啊,有点跟不上官方的节奏了。
程序员一鸣
2024/12/21
1550
鸿蒙开发:切换至基于rcp的网络请求
HarmonyOS 开发实践 —— 基于@ohos.util.stream的web离线缓存文件加载
通过web加载网址,onInterceptRequest拦截资源请求,web离线缓存的文件需要通过查看/data/storage/el2/base/cache/web/Cache目录来判断是否存在离线缓存,若存在缓存使用Context.cacheDir获取文件路径后,通过pathDir路径,再使用stream进行对文件读写。
小帅聊鸿蒙
2024/12/08
920
HarmonyOS 开发实践 —— 基于@ohos.util.stream的web离线缓存文件加载
一篇文章构建你的 NodeJS 知识体系(W字长文)
最近读《重学前端》,开篇就是让你拥有自己的知识体系图谱,后续学的东西补充到相应的模块,既可以加深对原有知识的理解,又可以强化记忆,很不错的学习方案。
coder_koala
2020/08/27
1.9K0
Vue + Element UI 实现权限管理系统 前端篇(三):工具模块封装
使用axios发起一个请求是比较简单的事情,但是axios没有进行封装复用,项目越来越大,会引起越来越多的代码冗余,让代码变得越来越难维护。所以我们在这里先对 axios 进行二次封装,使项目中各个组件能够复用请求,让代码变得更容易维护。
朝雨忆轻尘
2019/06/19
5K1
Vue + Element UI 实现权限管理系统 前端篇(三):工具模块封装
nodejs的session管理
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
OECOM
2020/07/01
1.7K0
#HarmonyOS NEXT#写了一个好用的语音播报demo
作为大前端开发者,想必大家都知道语音播报功能在应用开发中的很多场景下都非常实用,比如智能家居控制、新闻资讯播报、语音助手、支付收款等。而HarmonyOS NEXT为开发者提供了丰富的API和工具,使得开发这类功能变得非常简单和快捷,但是由于市面上关于HarmonyOS NEXT的语音播报使用的demo案例较少,所以本文就以这个背景来开发一个任何人都会用的语音播报的demo。
三掌柜
2024/01/26
9644
#HarmonyOS NEXT#写了一个好用的语音播报demo
HarmonyOS 开发实践 —— 基于XComponent的视频播放器高性能体验
onDataReceive回调中通过fs.writeSync传入沙箱文件的writeFd,将下载的数据流写入本地沙箱文件。
小帅聊鸿蒙
2024/12/17
2240
HarmonyOS 开发实践——基于原生能力的压缩与解压缩能力
当前 鸿蒙 暂无native的压缩与解压接口,本文主要介绍native侧通过zlib实现压缩与解压。
小帅聊鸿蒙
2024/11/20
1710
HarmonyOS 开发实践——基于原生能力的压缩与解压缩能力
推荐阅读
相关推荐
鸿蒙开发,远场通信服务rcp拦截器问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文