首页 > 其他分享 >鸿蒙实战开发:网络层的艺术——优雅封装与搭建指南(下)

鸿蒙实战开发:网络层的艺术——优雅封装与搭建指南(下)

时间:2024-12-22 15:20:31浏览次数:4  
标签:封装 鸿蒙 WanResponsitory 网络层 网络 return ApiRequest new data

前言

在前两篇文章中,我们深入探讨了网络层的封装和优化技巧。本文将带您走进网络层的实战应用,从架构设计到具体实现,一步步指导您如何使用我们精心构建的网络框架。

一、网络层架构设计

在鸿蒙应用开发中,一个清晰、合理的网络层架构是保证项目可维护性和扩展性的关键。以下是我们推荐的网络层目录结构:

项目
|-- network
    |-- data
        |-- models
            |-- params            // 请求模型
            |-- responses         // 返回模型
        |-- service             // 网络接口定义
        |-- sources
            |-- remote            // 网络数据源

二、Service网络接口设计与实现

1. 构建网络接口

接口常量文件ApiMethod.ets,用于集中管理所有网络请求的路径。

// 接口请求路径常量定义,便于统一管理和引用
const HARMONY_INDEX = "harmony/index/json";
export { HARMONY_INDEX };

2. 网络请求类

ApiRequest类作为网络请求的中心,负责网络库的初始化、配置以及请求的调用和拼装。

type DataClassConstructor<T> = ClassConstructor<ApiResult<T>>;
export class ApiRequest{

  private static instance: ApiRequest


  static getInstance (): ApiRequest {
    if (!ApiRequest.instance) {
      ApiRequest.instance = new ApiRequest()
    }
    return ApiRequest.instance
  }

  net : NetworkService

  constructor() {
    this.net =  new NetworkService("https://www.wanandroid.com/");
    this.net.dataConverter = new JsonDataConverter()
    this.net.addInterceptor(new DefaultInterceptor())
  }

  public getService() : NetworkService{
    return this.net;
  }

  private plainToClassApiResult<T>(ctor: DataClassConstructor<T>, data: object) : ApiResult<T>{
    return plainToClass(ctor,data,{
      enableImplicitConversion: false,
      exposeDefaultValues: true,}) as ApiResult<T>;
  }
  async requestHarmonyIndex(harmonyIndex: HarmonyIndexParam): Promise<ApiResult<HarmonyIndexResponse>> {
    let data =  await ApiRequest.getInstance().getService().request({
      act : HARMONY_INDEX,
      expectDataType : http.HttpDataType.OBJECT,
      queryParams : new Map(Object.entries(harmonyIndex)),
      method: RequestMethod.GET
    })
    let result :ApiResult<HarmonyIndexResponse> = this.plainToClassApiResult<HarmonyIndexResponse>( ApiResult , data.result as object,)
    return result;
  }


}

三、网络数据源层

1. 网络数据源

BaseRemoteSource类提供了基础的网络请求处理,包括显示加载弹窗和基本的错误处理。

// BaseRemoteSource 类实现基础网络请求和错误处理
class BaseRemoteSource {
  async baseRequest<T>(request: Promise<ApiResult<T>>, option?: DataSourceOption): Promise<DataResult<ApiResult<T>>> {
    try {
      // 显示加载提示
      NetworkUtil.showSpinner(option);
      const result = await request;
      // 隐藏加载提示
      NetworkUtil.hideSpinner(option);
      // 根据结果进行相应处理
      return result.errorCode === 0
        ? new SuccessData(result)
        : new ErrorData(new AppBusinessError(result.errorCode!, result.errorMsg!));
    } catch (e) {
      // 异常处理
      const error = e as BaseError;
      NetworkUtil.hideSpinner(option);
      if (option?.showErrorTips) {
        LibToast.show(error.message);
      }
      return new ErrorData(e);
    }
  }
}

2. 网络数据源实现类

WanRemoteSource类继承自BaseRemoteSource,实现了具体的网络请求。

// WanRemoteSource 类实现特定业务的网络请求
class WanRemoteSource extends BaseRemoteSource {
  async requestHarmonyIndex(harmonyIndex: HarmonyIndexParam): Promise<DataResult<ApiResult<HarmonyIndexResponse>>> {
    const option = new DataSourceOption();
    option.showSpinner = true;
    return this.baseRequest(ApiRequest.getInstance().requestHarmonyIndex(harmonyIndex), option);
  }
}

3. 数据仓库

WanResponsitory类作为数据仓库,负责协调远程数据源和可能的本地数据源。

// WanResponsitory 类实现数据仓库模式
class WanResponsitory implements IWanSource {
  private static instance: WanResponsitory;
  private remoteSource: IWanSource;

  private constructor() {
    this.remoteSource = new WanRemoteSource();
    // ...(省略部分代码)
  }

  public static getInstance(): WanResponsitory {
    if (!WanResponsitory.instance) {
      WanResponsitory.instance = new WanResponsitory();
    }
    return WanResponsitory.instance;
  }

  requestHarmonyIndex(harmonyIndex: HarmonyIndexParam): Promise<DataResult<ApiResult<HarmonyIndexResponse>>> {
    return this.remoteSource.requestHarmonyIndex(harmonyIndex);
  }
}

四、页面业务端使用

在页面业务逻辑中,我们通过调用数据仓库的方法来执行网络请求,并处理返回结果。

// 页面中按钮点击事件的处理
Button('网络请求')
  .attributeModifier(new ColumnButtonStyle)
  .onClick(() => {
    WanResponsitory.getInstance().requestHarmonyIndex(new HarmonyIndexParam()).then((value) => {
      if (value instanceof SuccessData) {
        const data = value as SuccessData<ApiResult<HarmonyIndexResponse>>;
        LibToast.show(`展示:${data.data?.data?.links?.name}`);
      } else if (value instanceof ErrorData) {
        const error = value.error;
        if (error instanceof AppBusinessError) {
          LibToast.show(`业务异常:${error.code}`);
        }
      }
    });
  });

结语

本文详细介绍了如何使用我们编写的网络框架,从架构设计到具体实现,每一步都体现了对高效、可维护代码的追求。希望这些知识能够帮助您在鸿蒙开发中更加得心应手,构建出更加健壮和用户友好的应用。

标签:封装,鸿蒙,WanResponsitory,网络层,网络,return,ApiRequest,new,data
From: https://www.cnblogs.com/wangerdan115/p/18622167

相关文章

  • 鸿蒙实战开发:网络层的艺术——优雅封装与搭建指南(中)
    前言在鸿蒙开发的广袤天地中,网络层的搭建与封装无疑是构建高效、稳定应用的基石。继上篇的探索之后,本文将继续深入网络层的优化之旅,揭秘如何通过类型转换器、请求查询附加器以及丰富的常量参数,将网络层的构建艺术推向一个新的高度。一、网络请求的深度优化数据类型转换器:定义与......
  • axios--基于vuejs的封装,实现nodejs服务器的前端请求响应
    官网地址:https://www.axios-js.com/zh-cn/docs/vue-axios.html基于ref的变量显示打开下载好的vuehello2项目,打开main.js,添加:importaxiosfrom'axios'importVueAxiosfrom'vue-axios'下方添加:.use(VueAxios,axios)注意安装:npminstallaxiosvue-axios找到SubHello1.vu......
  • 3. 八种基本数据类型大小及封装类
    基本类型大小(字节)默认值封装类byte1(byte)0Byteshort2(short)0Shortint40Integerlong80LLongfloat40.0fFloatdouble80.0dDoubleboolean-falseBooleanchar2\u0000(null)Character注:1.int是基本数据类型,Integer是in......
  • 【day08】面向对象——封装
    【day07】面向对象回顾:1.面向对象:是java的核心编程思想,自己的事情找对象帮我们去做有很多功能,别人帮我们实现好了,我们只需要找来这个对象,就可以调用这个对象中实现好的功能a.啥时候使用面向对象思想编程:在一个类中想访问另外一个类的成员(成员......
  • 鸿蒙HarmonyOS 5.0快速开发APP:一步一步教你从入门到进阶
    电信巨擘华为10月22日宣布推出“纯血”鸿蒙作业系统(操作系统)HarmonyOS5.0,引发全球智能装备市场高度关注。这套系统强调完全自主研发,是首个国产行动作业系统。这套系统已成为全球第三大行动作业系统,仅次于苹果iOS系统和谷歌旗下的安卓(Android)。华为宣布正式发布纯血鸿蒙作......
  • 鸿蒙HarmonyOS应用开发 | 「鸿蒙技术分享」HarmonyOS NEXT元服务卡片实战体验
    「鸿蒙技术分享」—HarmonyOSNEXT元服务卡片实战体验HarmonyOSNEXT是华为鸿蒙系统的最新版本,带来了更为流畅、高效的体验,并以元服务卡片(ServiceWidget)为核心,优化了服务分发和交互体验。本文将从开发者的角度,分享如何开发和部署元服务卡片,并结合代码实例,带你体验全新的卡片开......
  • 封装红黑树实现map/set
    封装红黑树实现mymap和myset补充一下AVL树和红黑树的对比:#include<iostream>usingnamespacestd;#include<vector>#include<time.h>#include"RBTree.h"#include"AVLTree.h"voidTestTree(){ constintN=1000000; vector<int>v; v.......
  • 在鸿蒙环境中,关系型数据库的详细讲解(1)内含:数据库的创建,数据的插入同步(insert),异步(
    前言看这篇文章的应该有和我一样是大学生并且去了一个班并且在做一个结课项目吧,至于班的名字这里就不详细说了,那废话不多说直接进入正题1.为什么要用数据库1.1持久化数据存储使用数据库可以在应用断电,重启保持数据不丢失我在这里举个例子:你在王者*耀里面自定义了一个键......
  • 鸿蒙元服务从0到上架【第一篇】(最后一步容易中招)
    最后一招没做好,上架审核极可能被驳回!何为元服务元服务(原名为原子化服务)是华为HarmonyOS提供的一种面向未来的服务提供方式,是有独立入口、免安装、可为用户提供一个或多个服务的新型应用程序形态。元服务基于HarmonyOSAPI开发,支持运行在1+8+N设备上,供用户在合适的场景......
  • 鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作
    鸿蒙技术分享:HarmonyOSNext深度解析:分布式能力与跨设备协作实战随着万物互联时代的到来,操作系统作为连接设备、应用与用户体验的核心,扮演着不可或缺的角色。华为最新发布的HarmonyOSNext(鸿蒙操作系统下一代版本)不仅在技术架构上实现了颠覆性升级,更在生态体验上迈向了一个新的......