前言

随着鸿蒙生态蓬勃发展,各种实用的鸿蒙三方库已成为开发者高效开发的利器。它不仅能拓展应用功能边界,还能大幅提升开发效率,不管你是刚接触鸿蒙开发的小白,还是开发时长两年半的老司机,掌握这些三方库,绝对能让你在鸿蒙开发上更加方便!博主在日常的工作开发中也也是如此,今天给大家分享的是ef_rcpV1.0.8(API12)三方库

📚简介

ef_rcpeftool的rcp网络请求相关包.提供了rcp的上传,下载,post,get,cancel,delete,put等操作

🛠️包含组件

模块 介绍
efRcp 提供针对efRcp的一系列请求相关功能的配置工具类
efRcpConfig efRcp所有的相关配置命名空间
efRcpClientApi 提供针对于统一post,get,delete,put等请求的灵活封装
EfRcpError efRcp的统一异常处理对象,内置toString方法
EfRcpResponse efRcp的统一响应对象,成功请求的数据为data异常的结果为error

📦安装

🍊ohpm

  • 执行安装命令
ohpm install @yunkss/ef_rcp
  • 特殊说明

ef_rcp依赖于ef_json,故将依赖引入为dependencies方式,即开发者在使用ef_rcp时无需自行引入ef_json,ef_rcp会自动下载对应依赖版本
但如果开发者自身业务需要使用JSON相关内容,则仍需要自行引入ef_json

📦使用

1.在项目中引入插件

import { efRcpClientApi, efRcpConfig,xxxx} from '@yunkss/ef_rcp'

类按需引入,项目需要使用那个就引入

2.ef_rcp使用API

前言

efRcp封装需要大家共建和提出建议与需求,已完善传post,postForm,put,get,delete,cancel请求,统一上传下载,以及配置证书,期待大家提出宝贵意见

后端Demo示例为Java开发,大家自行下载使用与阅读,如有问题请提出Issue

后端Demo示例地址点此访问

1.efRcpConfig配置类参数详解(1.0.8有改动)
  • timeout 超时对象
    /**
     * 允许建立连接的最长时间
     */
    connectMs?: number;
    /**
     * 允许传输数据的最长时间
     */
    transferMs?: number;
  • sysCodeEvent 系统级别的请求响应码对象(1.0.1有改动)
    /**
     * 请求响应码监听-业务自行处理数据
     */
    listener: (code: number) => void = () => {};
  • businessCodeEvent 业务级别的请求响应码对象(1.0.1+)
    /**
     * 业务级别自定义错误编码/异常code字段名称
     */
    businessCodeName: string = '';
    /**
     * 请求响应码监听-业务自行处理数据
     */
    listener: (code: Object | null) => void = () => {
    };
  • codeEvent 系统级别和业务自定义级别请求响应码对象(1.0.8+)
  /**
   * 业务级别自定义错误编码/异常code字段名称
   */
  businessCodeName: string = '';
  /**
   * 请求响应码监听-业务自行处理数据sysCode系统级别编码,busCode业务自定义编码
   */
  listener: (sysCode: Object | null, busCode: Object | null) => void = () => {
  };
  • cryptoEvent 请求拦截加解密操作
    /**
     * 请求加密操作-业务自行处理数据 - 默认无任何操作直接返回
     */
    requestEncoder: (request: rcp.RequestContext) => rcp.RequestContext =
      (request: rcp.RequestContext): rcp.RequestContext => {
        return request;
      };
    /**
     * 请求解密操作-业务自行处理数据 - 默认无任何操作直接返回
     */
    responseDecoder: (response: rcp.Response) => rcp.Response =
      (response: rcp.Response): rcp.Response => {
        return response;
      };
  • sessionListener 会话监听器
    /**
     * 会话关闭事件回调。会话关闭时调用
     */
    onClosed: () => void = () => {};
    /**
     * 会话取消事件的回调。会话取消时调用
     */
    onCanceled: () => void = () => {};
  • uploadEvent 上传相关事件
    /**
     * 监听上传进度
     */
    onUploadProgress: (progress: number) => void = (progress: number) => {};
  • downloadEvent 下载相关事件
    /**
     * 监听下载进度
     */
    onDownloadProgress: (progress: number) => void = (progress: number) => {};
  • securityCfg 证书相关配置
    /**
     * 证书颁发机构
     */
    remoteValidation?: 'system' | 'skip' | rcp.CertificateAuthority | rcp.ValidationCallback = 'system';
    /**
     * 客户端证书,身份认证
     */
    certificate?: rcp.ClientCertificate;
    /**
     * 安全连接期间的服务器身份验证配置
     */
    serverAuthentication?: rcp.ServerAuthentication
  • securityUtil 证书工具类
    /**
     * 读取证书内容
     * @param certPath 证书地址需要为沙箱环境地址
     * @returns 证书字符串
     */
    static readClientCerts(certPath: string): string;
  • loading 全局加载对象设置
    /**
     * 是否启用 - 默认true
     */
    static enable: boolean = true;
    /**
     * loading提示内容 - 默认为【努力获取数据中,请稍后...】
     */
    static content: string = '努力获取数据中,请稍后...';
    /**
     * 动画builder属性-图片类-只支持gif动图 暂不支持在内部使用状态变量
     */
    static imgBuilder?: WrappedBuilder<[]>;
    /**
     * loading是否为lottie动画
     */
    static enableLottie: boolean = false
    /**
     * lottie动画所需画板 - enableLottie 为true时生效
     */
    static lottieRenderingCtx: CanvasRenderingContext2D =  new CanvasRenderingContext2D(new RenderingContextSettings(true));
    /**
     * 自定义Loading弹框 1.0.8+
     */
    static loadingBuilder?: WrappedBuilder<[]>;
  • token token相关配置
    /**
     * 登录成功后的token的key
     */
    static tokenName: string = 'authorization';
    /**
     * 登录成功后的token值
     */
    static tokenValue: string = '';
  • commonParams 请求公共传参(1.0.6有改动)
    /**
    * 基础请求前缀地址 非必填 需要时设置
    */
    baseURL?:string; 
    /**
     * 请求路径 必填
     */
    url: string = '';
    /**
     * 当次请求需要设置的请求头
     */
    headers?: Record<string, string>;
    /**
     * 当次请求需要设置的cookies
     */
    cookies?: Record<string, string>;
    /**
     * 当次请求需要设置的loading文本
     */
    loadingTxt?: string;
    /**
     * 当次请求的临时开启或关闭Loading控制(1.0.6+)
     */
    loading?: boolean;
    /**
     * Loading窗口的背景颜色(1.0.7+)
     */
    loadingColor?: string;
  • requestBaseParams post/put请求所需参数对象 - 继承所有commonParams参数(1.0.2有改动)
    /**
     * 请求参数 post/put
     */
     query: Record<string, Object> | rcp.FormFields | rcp.MultipartFormFields | ESObject = {};
    /**
     * 解决post传参但是需要将参数拼接URL情况
     */
    isParams?: boolean;
    
  • deleteParams delete请求所需参数对象 - 继承所有commonParams参数(1.0.3+)
    /**
     * 请求参数 delete
     */
    query: Record<string, Object> | ESObject = {};
  • uploadParams 上传入参对象 - 继承所有commonParams参数(1.0.6有改动)
    /**
     * 上传文件字段
     */
    fileInfo: rcp.MultipartFormFields = {};
    /**
     * 断点续传参数(1.0.6+)
     */
    transferRange: rcp.TransferRange = {};
  • downloadParams 下载入参对象 - 继承所有commonParams参数
    /**
     * 下载文件名
     */
    fileName: string = '';
  • isConvertError 请求转换JSON失败时是否返回结果字符串
  export let isConvertError: boolean = false;
2.efRcp工具类(1.0.8有改动)
  • getInstance 懒汉模式获取EfRcp类单例

  • create 创建session对象 如业务某些地方需要根据参数重新创建session则可多次调用,默认只需要调用一次

  • builder 获取构建后的session对象

  • setBaseURL 设置全局请求地址前缀 - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • enableLogInterceptor 是否启用日志拦截器 - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • addCustomInterceptors 添加用户自定义拦截器 - 可添加多个 - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • addCommonHeaders 添加公共的header - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • addCommonCookies 添加公共的cookie - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • setConfig 全部自定义session配置 - 特殊场景如efRcp所有默认配置均不满足开发需求,则全部自定义并设置

    注意调用完setConfig后必须调用create方法重新创建session对象,否则配置不生效

  • addSysCodeEvent 添加统一的系统框架级别编码拦截操作(1.0.1有改动) - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • addBusinessCodeEvent 添加统一的业务级别编码拦截操作(1.0.1+) - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • addCryptoEvent 添加自定义加解密拦截 - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • setTimeOut 设置超时时间 - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • setSessionListener 设置会话监听 - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • setUploadEvent 设置上传进度操作 - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • setDownLoadEvent 设置下载进度操作 - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • addSecurity 设置证书 - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • disableLoading 禁用全局加载框 - 设置后无需重新创建

1.0.6+支持传入变量来控制是否启用,且无需再次create

  • setLoadingContent 更改全局默认loading的提示内容 - 设置后无需重新创建

  • setLoadingImg 更改全局默认loading的图片- 全局builder,内容业务自行传入,只支持gif动图,不支持内部使用状态变量

  • enableLottie 启用loading加载使用lottie动画 - 设置后无需重新创建

  • setLottieAnimation 设置lottie动画 - 设置后无需重新创建

  • setDNS 设置DNS相关配置 - 设置后需要调用create重新创建,可批量链式调用后最后再去create

  • efRcp 抛出的全局efRcp对象,可链式调用

  • convertError 将异常结果转换

  • setLoadingBuilder 设置自定义Loading弹框内容样式(1.0.8+)

  • addCodeEvent 添加系统以及业务编码同时监听(1.0.8+)

3.efRcpClientApi工具类(1.0.3有改动)

该工具类提供统一简化各种请求方式

  • post请求 json格式 async/await 方式
    //参数说明
    async post<E>(postParam: efRcpConfig.requestBaseParams, cls?: ClassConstructor<E>,securityCfg?: efRcpConfig.securityCfg): Promise<EfRcpResponse<E>>
    //postParam post请求所需参数,详见efRcpConfig.requestBaseParams
    //cls 需要返回的泛型对象,内部会做类型转换,转换后泛型的方法调用不会报错,嵌套对象时只有第一层生效
    //securityCfg 本次请求是否需要更换证书 - 证书对象,详见efRcpConfig.securityCfg
    //EfRcpResponse<E> 为响应结果对象,请求成功数据存入data字段,请求失败存入error字段,如有场景需要判断系统框架级别error则获取使用
  • postForm请求 async/await 方式
    //参数说明   参数为form格式
    async postForm<E>(postParam: efRcpConfig.requestBaseParams, cls?: ClassConstructor<E>,securityCfg?: efRcpConfig.securityCfg): Promise<EfRcpResponse<E>>
    //postParam post请求所需参数,详见efRcpConfig.requestBaseParams
    //cls 需要返回的泛型对象,内部会做类型转换,转换后泛型的方法调用不会报错,嵌套对象时只有第一层生效
    //securityCfg 本次请求是否需要更换证书 - 证书对象,详见efRcpConfig.securityCfg
    //EfRcpResponse<E> 为响应结果对象,请求成功数据存入data字段,请求失败存入error字段,如有场景需要判断系统框架级别error则获取使用
  • postMultipartForm请求 async/await 方式 (1.0.2+)
    //参数说明   参数为MultipartForm格式
    async postMultipartForm<E>(postParam: efRcpConfig.requestBaseParams, cls?: ClassConstructor<E>,securityCfg?: efRcpConfig.securityCfg): Promise<EfRcpResponse<E>>
    //postParam post请求所需参数,详见efRcpConfig.requestBaseParams
    //cls 需要返回的泛型对象,内部会做类型转换,转换后泛型的方法调用不会报错,嵌套对象时只有第一层生效
    //securityCfg 本次请求是否需要更换证书 - 证书对象,详见efRcpConfig.securityCfg
    //EfRcpResponse<E> 为响应结果对象,请求成功数据存入data字段,请求失败存入error字段,如有场景需要判断系统框架级别error则获取使用
  • get请求 async/await 方式
    //参数说明 格式为  getXXXX/id/name/xxxx
    async get<E>(getParam: efRcpConfig.commonParams, cls?: ClassConstructor<E>,securityCfg?: efRcpConfig.securityCfg): Promise<EfRcpResponse<E>>
    //getParam get请求所需参数,详见efRcpConfig.commonParams
    //cls 需要返回的泛型对象,内部会做类型转换,转换后泛型的方法调用不会报错,嵌套对象时只有第一层生效
    //securityCfg 本次请求是否需要更换证书 - 证书对象,详见efRcpConfig.securityCfg
    //EfRcpResponse<E> 为响应结果对象,请求成功数据存入data字段,请求失败存入error字段,如有场景需要判断系统框架级别error则获取使用
  • put请求 async/await 方式
    //参数说明
    async put<E>(putParam: efRcpConfig.requestBaseParams, cls?: ClassConstructor<E>,securityCfg?: efRcpConfig.securityCfg): Promise<EfRcpResponse<E>>
    //putParam put请求所需参数,详见efRcpConfig.requestBaseParams
    //securityCfg 本次请求是否需要更换证书 - 证书对象,详见efRcpConfig.securityCfg
    //EfRcpResponse<E> 为响应结果对象,请求成功数据存入data字段,请求失败存入error字段,如有场景需要判断系统框架级别error则获取使用
  • delete请求 async/await 方式(1.0.3有改动)
    //参数说明
    async delete<E>(deleteParam: efRcpConfig.deleteParams, cls?: ClassConstructor<E>,securityCfg?: efRcpConfig.securityCfg): Promise<EfRcpResponse<E>>
    //deleteParam delete请求所需参数,详见efRcpConfig.deleteParams
    //cls 需要返回的泛型对象,内部会做类型转换,转换后泛型的方法调用不会报错,嵌套对象时只有第一层生效
    //securityCfg 本次请求是否需要更换证书 - 证书对象,详见efRcpConfig.securityCfg
    //EfRcpResponse<E> 为响应结果对象,请求成功数据存入data字段,请求失败存入error字段,如有场景需要判断系统框架级别error则获取使用
  • patch请求 async/await 方式
    //参数说明
    async patch<E>(patchParam: efRcpConfig.requestBaseParams, cls?: ClassConstructor<E>,securityCfg?: efRcpConfig.securityCfg): Promise<EfRcpResponse<E>>
    //patchParam patch请求所需参数,详见efRcpConfig.requestBaseParams
    //cls 需要返回的泛型对象,内部会做类型转换,转换后泛型的方法调用不会报错,嵌套对象时只有第一层生效
    //securityCfg 本次请求是否需要更换证书 - 证书对象,详见efRcpConfig.securityCfg
    //EfRcpResponse<E> 为响应结果对象,请求成功数据存入data字段,请求失败存入error字段,如有场景需要判断系统框架级别error则获取使用
  • cancel请求 async/await 方式
    //参数说明
    async cancel(url: string)
    //url 为取消请求方法的url 全路径应该为 efRcpParams.baseURL+url 组合而成
  • uploadFile 统一的上传请求MultipartFormFields形式 async/await 方式
    //参数说明
    async uploadFile<E>(uploadParam: efRcpConfig.uploadParams, cls?: ClassConstructor<E>,securityCfg?: efRcpConfig.securityCfg): Promise<EfRcpResponse<E>>
    //uploadParam 上传文件所需参数,详见efRcpConfig.uploadParams
    //cls 需要返回的泛型对象,内部会做类型转换,转换后泛型的方法调用不会报错,嵌套对象时只有第一层生效
    //securityCfg 本次请求是否需要更换证书 - 证书对象,详见efRcpConfig.securityCfg
    //EfRcpResponse<E> 为响应结果对象,请求成功数据存入data字段,请求失败存入error字段,如有场景需要判断系统框架级别error则获取使用
  • downloadFile 统一的下载请求 async/await 方式
    //参数说明
    async downloadFile<E>(downloadParam: efRcpConfig.downloadParams, cls?: ClassConstructor<E>): Promise<EfRcpResponse<E>>
    //downloadParam 下载文件所需参数,详见efRcpConfig.downloadParams
    //cls 需要返回的泛型对象,内部会做类型转换,转换后泛型的方法调用不会报错,嵌套对象时只有第一层生效
    //securityCfg 本次请求是否需要更换证书 - 证书对象,详见efRcpConfig.securityCfg
    //EfRcpResponse<E> 为响应结果对象,请求成功数据存入data字段,请求失败存入error字段,如有场景需要判断系统框架级别error则获取使用
  • downloadStream 统一的下载请求 async/await 方式
    //参数说明
    async downloadStream<E>(downloadParam: efRcpConfig.downloadParams, cls?: ClassConstructor<E>): Promise<EfRcpResponse<E>>
    //downloadParam 下载文件所需参数,详见efRcpConfig.downloadParams
    //cls 需要返回的泛型对象,内部会做类型转换,转换后泛型的方法调用不会报错,嵌套对象时只有第一层生效
    //securityCfg 本次请求是否需要更换证书 - 证书对象,详见efRcpConfig.securityCfg
    //EfRcpResponse<E> 为响应结果对象,请求成功数据存入data字段,请求失败存入error字段,如有场景需要判断系统框架级别error则获取使用
  • 初始化参数配置示例

请求相关的参数配置建议在Ability的onWindowStageCreate方法中配置部分已知的固定类型的

其余如拦截器等在使用时灵活配置即可,下方代码示例中有详细配置步骤,请查阅

可使用BuildProfile获取到当前运行的还是debug/qa/test/release等 然后设置不同的请求信息

  if(运行环境===debug){
    //关于rcp的配置
    efRcp
       //设置请求路径
      .setBaseURL("http://aliyunmr.com:18088")
      //启用打印日志
      .enableLogInterceptor()
      //更改loading文本
      .setLoadingContent('充值有大礼包...')
      //表示如果response.toJSON()异常时将响应字符串返回,false则表示值返回异常提醒而不返回结果
      .convertError(true)
      //设置一部分不需要从接口获取的常量公共头
      .addCommonHeaders({
        "platform": "HarmonyOS",
        "version": "V1.0.0"
      })
      //设置loading为gif图片
      // .setLoadingImg(wrapBuilder(loadingImg))
      //启动lottie  与setLoadingImg互斥不可同事使用
      .enableLottie()
      //设置自定义loading样式和内容
      .setLoadingBuilder(wrapBuilder(loadingBuilder))
      //添加系统以及业务编码监听
      .addCodeEvent({
        businessCodeName: 'csxErrorCode',
        listener: (sysCode, busCode) => {
          //此处解决弹框不出现问题
          this.getUIContext().runScopedTask(() => {
            ToastUtil.showToast(sysCode + '+++++++' + busCode);
          });
        }
      //创建session对象,需要再设置为一系列操作后再调用,否则设置不生效,可在特殊情况处设置其他操作后重新创建session
      .create();
  }
  if(运行环境===qa){
    //关于rcp的配置
    efRcp
       //设置请求路径
      .setBaseURL("http://aliyunmr.com:18088")
      //更改loading文本
      .setLoadingContent('正式环境的loading...')
      //设置公共头
      .addCommonHeaders({
        "platform": "HarmonyOS",
        "version": "V1.0.1"
      })
      .enableLogInterceptor(false)  设置为false即可关闭
      //设置loading为gif图片
      .setLoadingImg(wrapBuilder(loadingImg))
      //设置自定义loading样式和内容
      .setLoadingBuilder(wrapBuilder(loadingBuilder))
      //添加系统以及业务编码监听
      .addCodeEvent({
        businessCodeName: 'csxErrorCode',
        listener: (sysCode, busCode) => {
          //此处解决弹框不出现问题
          this.getUIContext().runScopedTask(() => {
            ToastUtil.showToast(sysCode + '+++++++' + busCode);
          });
        }
      //创建session对象,需要再设置为一系列操作后再调用,否则设置不生效,可在特殊情况处设置其他操作后重新创建session
      .create();
  }
  • 自定义loading样式示例(1.0.8+)

  //1.编写业务所需自定义样式,注意不可以使用传入变量
  @Builder
  function loadingBuilder() {
    Column() {
      Image($r("app.media.tLoading")).width(40)
      Text('11111...').fontColor('#fff')
    }
    .width('300px')
    .height('400px')
    .backgroundColor('#aa000000')
  }

  //2.在Ability或者需要的地方调用
  efRcp
  .setLoadingBuilder(wrapBuilder(loadingBuilder))
  • 登录示例
  async login() {
    //此处模拟系统第一次调用接口,设置lottie加载动画
    //设置动画必须要加100ms的timer,原因为官方需要再canvas的onready方法后再设置动画
    //而点击时才创建窗口,故需要等窗口的dom原始绘制完,再进行动画创建
    setTimeout(() => {
      efRcp
        .setLottieAnimation((ctx: CanvasRenderingContext2D) => {
          lottie.destroy('2016');
          lottie.loadAnimation({
            container: ctx, // 渲染上下文
            renderer: 'canvas', // 渲染方式
            loop: true, // 是否循环播放,默认true
            autoplay: true, // 是否自动播放,默认true
            name: '2016', // 动画名称
            contentMode: 'Contain', // 填充的模式
            frameRate: 20, //设置animator的刷帧率为20
            //此处的动画只能是动画内容json格式,故需要将xxx.json放入rawfile中读取内容设置
            animationData: JSON.parse(this.lottieStr)
          })
        });
    }, 100)
    //登录  如果需要转换类型,则post后可不写类型,将类型传入到post方法的第二个入参
    let dto = await efRcpClientApi.post({
      url: '/api/eftool/login',
      query: {
        'account': 'efadmin',
        'pwd': '123456'
      },
      loadingTxt: '小的正在努力奋斗...'
    }, OutDTO<UserDTO>);//OutDTO<UserDTO>表示需要将返回结果转换为OutDTO<UserDTO>类型,则OutDTO的方法可以调用
    if (dto.data) {
      //dto.data.getXXX()  getXXX 方法此处不会报错
      //请求成功后将token存储在efRcpParams.tokenValue
      efRcpConfig.token.tokenValue = dto.data.getDataRow().token;
      efRcpConfig.token.tokenName = "Authorization";
      this.message = JSON.stringify(dto.data.getDataRow());
    }
    //else部分如果业务需要判断该系统异常则加,否则只判断dto.data即可
    else {
      this.message = dto.error?.message;
    }
  • 切换baseURL示例(1.0.2+)
  async testChangeBaseURL() {
    let dto = await efRcpClientApi.get<string>({
      baseURL: 'https://gitee.com',
      url: '/yunkss/ef-tool/access/add_access_log',
    });
    this.message = JSON.stringify(dto);
  }
  • post示例 json格式
   async postJSON() {
    let dto = await efRcpClientApi.post <OutDTO<UserDTO>>({
      url: '/api/eftool/post',
      isParams: true, //此处模拟虽然是post,但是需要将参数拼接url的特例
      query: {
        "nickName": "旺旺崔冰冰",
        "account": 'yunkss@163.com',
        "age": 12,
        "hobby": ["吃", "喝", "敲代码"],
        "sex": true
      }
    });
    this.message = JSON.stringify(dto);
  }
  • post示例 form格式 - 附带重新设置某些参数如追加公共headers
  async postForm() {
    //此处演示某些场景需要获取到一些数据后再次设置session的配置
    efRcp
      .addCommonHeaders({
        //如此处需要从接口中获取公共参数如sign,后再去设置公共请求头
        "csxChange": "HarmonyOS1.1.1",
        "sign":"从接口获取的sign值"
      })
      .addSysCodeEvent({
        listener: (code: number) => {
          Logger.debug("---------addSysCodeEvent监听事件-----", code + "")
        }
      })
      .addBusinessCodeEvent({
        businessCodeName: 'csxErrorCode',
        listener: (codeValue) => {
          Logger.debug('---------addBusinessCodeEvent监听-----------', codeValue as string)
        }
      })
      //切记需要调用create重新创建session否则设置不生效
      .create();
    //登录
    let dto = await efRcpClientApi.postForm<OutDTO<UserDTO>>({
      url: '/api/eftool/postFormData',
      query: {
        "nickName": "旺旺崔冰冰",
        "account": 'yunkss@163.com',
        "age": 12,
        "hobby": ["吃", "喝", "敲代码"],
        "sex": true
      }
    });
    this.message = JSON.stringify(dto);
  }
  • get示例
  async testGet() {
    let dto = await efRcpClientApi.get<OutDTO<string>>({
      url: '/api/eftool/get/122341',
      headers: {
        "testHeader": "111"
      },
      cookies: {
        "testCookie": "csx"
      }
    });
    this.message = JSON.stringify(dto);
  }
  • put示例
  async testPUT() {
    let dto = await efRcpClientApi.put<OutDTO<string>>({
      url: '/api/eftool/put',
      query: {
        "nickName": "旺旺崔冰冰",
        "account": 'yunkss@163.com',
        "age": 12,
        "hobby": ["吃", "喝", "敲代码"],
        "sex": true
      }
    });
    this.message = JSON.stringify(dto);
  }
  • delete示例
  async testDelete() {
    let dto = await efRcpClientApi.delete<OutDTO<string>>({
      url: '/api/eftool/delete/5345345'
    });
    this.message = JSON.stringify(dto);
  }
  async testDeleteBody() {
    let dto = await efRcpClientApi.delete<OutDTO<string>>({
      url: '/api/eftool/deleteBody',
      query: {
        "id": "1111111"
      }
    });
    this.message = JSON.stringify(dto);
  }
  • cancel示例
  async testCancel() {
    let dto = await efRcpClientApi.post <OutDTO<UserDTO>>({
      url: '/api/eftool/post',
      query: {
        "nickName": "旺旺崔冰冰",
        "account": 'yunkss@163.com',
        "age": 12,
        "hobby": ["吃", "喝", "敲代码"],
        "sex": true
      }
    });
    await efRcpClientApi.cancel('/api/eftool/post');
  }
  • patch 示例
  async testPATCH() {
    let dto = await efRcpClientApi.patch<OutDTO<string>>({
      url: '/api/eftool/patch/12306',
      query: {
        "nickName": "旺旺崔冰冰",
        "account": 'yunkss@163.com',
        "age": 12,
        "hobby": ["吃", "喝", "敲代码"],
        "sex": true
      }
    });
    this.message = JSON.stringify(dto);
  }
  • 上传示例
    上传进度在如下处
    .setUploadEvent({
        onUploadProgress: (progress) => {
          Logger.debug("---------测试上传进度----------", progress + "%")
        }
    })
  //此处演示需要使用上传进度时再去设置,全局只需要设置一次即可
   efRcp
   .setUploadEvent({
     onUploadProgress: (progress) => {
       Logger.debug("---------测试上传进度----------", progress + "%")
     }
   })
   //切记需要调用create重新创建session否则设置不生效
   .create();
   let arr = getContext().resourceManager.getMediaContentSync($r("app.media.abc").id);
    //上传
    let dto =
      await efRcpClientApi.uploadFile<OutDTO<string>>({
        url: '/api/eftool/upload',
        fileInfo: {
          "file": {
            contentType: 'multipart/form-data',
            remoteFileName: 'newRcp.png',
            contentOrPath: {
              content: buffer.from(arr).buffer
            }
          }
        }
      });
    this.message = JSON.stringify(dto);
  • 下载示例
    下载进度在如下处
    .setDownLoadEvent({
        onDownloadProgress: (progress) => {
          Logger.debug("---------测试下载进度----------", progress + "%")
        }
    })
  //此处演示需要使用下载进度时再去设置,全局只需要设置一次即可
  efRcp
  .setDownLoadEvent({
    onDownloadProgress: (progress) => {
      Logger.debug("---------测试下载进度----------", progress + "%")
    }
  })
  //切记需要调用create重新创建session否则设置不生效
  .create();
  async testDownloadStream() {
    let dto =
      await efRcpClientApi.downloadStream<OutDTO<string>>({
        url: '/api/eftool/download/13c79c32-c291-429b-a1a9-e6ae2cb0b635-IMG_010.png',
        fileName: 'abc.jpg'
      });
    this.message = JSON.stringify(dto);
  }
  async testDownloadFile() {
    let dto =
      await efRcpClientApi.downloadFile<OutDTO<string>>({
        url: '/api/eftool/download/ddbab76c-6d73-4ba8-8efc-9e5264ade01a-newRcp.png',
        fileName: 'csx1.png'
      })
    this.message = JSON.stringify(dto);
  }
4.EfRcpError工具类
  • 字段
  /**
   * 编码
   */
  code: number;
  /**
   * 名称
   */
  name: string;
  /**
   * 消息
   */
  message: string;
  /**
   * 堆栈信息
   */
  stack?: string | undefined;
  • toString 转换成json字符串

  • getCode 获取错误码

  • getName 获取错误名称

  • getMessage 获取错误提示

5.EfRcpResponse工具类
  /**
   * 请求成功返回的数据
   */
  data?: E;

  /**
   * 请求失败返回的系统框架级错误信息 - 如连接超时,400,401,403,500等
   */
  error?: EfRcpError;
  
  //如果系统不关注系统级别的异常,则调用接口只需要判断data不为空则请求成功即可

eftool工具类ohpm地址

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐