在软件开发中,底层库的更换或升级是常见的需求,这可能由性能提升、新功能需求或安全性考虑等因素驱动。为了降低迁移成本,良好的设计模式至关重要。

在版本迭代过程中,网络请求库可能会经历从A到B再到C的演进。为了实现业务层的无感切换,需要在各个请求库和业务代码之间封装隔离代码,以实现第三方网络库的灵活更换。

回调接口 (ICallback)

定义了ICallback接口,包含onSuccessonFailure两个方法,用于处理异步操作的成功和失败情况。

/**
* ICallback 接口定义了处理异步操作成功时的回调逻辑。
* 这个接口通常用于网络请求操作,当操作成功完成时,
* 通过实现此接口的对象的 onSuccess 方法来处理结果。
*/
export interface ICallback {
/**
* 当异步操作成功时调用此方法。
*
* @param result 操作结果的数据,通常是一个字符串类型,可以是 JSON 格式、XML 格式或其他文本格式。
* 具体格式取决于异步操作的上下文和需求。
*/
onSuccess(result: string): void; /**
* 当异步操作失败时调用此方法。
*
* @param error 错误信息,提供失败操作的描述。
* 这可以是技术性错误(如网络问题、解析错误等)或业务逻辑错误。
*/
onFailure(error: string): void;
}

HTTP响应处理 (HttpCallback)

HttpCallback类实现了ICallback接口,专门为处理HTTP响应结果设计。它将响应字符串解析为JSON对象,并调用onParsedSuccess方法来处理解析后的对象。

import { ICallback } from './ICallback';

/**
* HttpCallback 类是 ICallback 接口的一个实现,专门为处理 HTTP 响应结果设计。
* 它定义了一个从 JSON 字符串解析结果并将其转换为特定类型对象的 onSuccess 方法,
* 然后通过抽象方法 onParsedSuccess 将对象传递给进一步的处理。
* T 泛型允许开发者指定他们希望从 JSON 字符串解析得到的类型。
*/
export abstract class HttpCallback<T> implements ICallback {
/**
* 当异步操作成功时调用此方法。
* 此方法实现了 ICallback 接口的 onSuccess,将字符串结果解析为 JSON 对象,
* 并调用抽象方法 onParsedSuccess 来处理解析后的对象。
*
* @param result 异步操作返回的 JSON 格式的字符串数据。
*/
onSuccess(result: string): void {
// 将 JSON 格式的字符串结果解析为一个对象,对象的类型由泛型 T 指定。
let objResult: T = JSON.parse(result) as T;
// 将解析后的对象传递给抽象方法 onParsedSuccess 进行进一步处理。
this.onParsedSuccess(objResult);
} /**
* 当异步操作失败时调用此方法。
*
* @param error 错误信息,提供失败操作的描述。
* 这可以是技术性错误(如网络问题、解析错误等)或业务逻辑错误。
*/
onFailure(error: string): void { } /**
* 抽象方法,用于处理从 JSON 字符串成功解析后得到的特定类型的对象。
* 具体的处理逻辑需要在子类中实现。
*
* @param objResult 从 JSON 字符串解析得到的特定类型的对象。
*/
protected abstract onParsedSuccess(objResult: T): void;
}

HTTP请求处理器接口 (IHttpRequest)

IHttpRequest接口定义了postget两个方法,用于发送POST和GET请求。

// 引入 ICallback 接口的声明
import { ICallback } from './ICallback'; /**
* IHttpRequest 接口定义了处理 HTTP 请求所需的方法。
* 该接口包含一个 post 方法,用于发送 POST 请求到指定的 URL。
*/
export interface IHttpRequest {
/**
* 发送一个 POST 请求到指定的 URL。
*
* @param url 请求的目标 URL 地址。
* @param params 一个包含请求参数的 Map 对象,键和值都是字符串类型。
* @param callback 一个回调函数,用于处理请求完成后的结果。
* 这个回调函数遵循 ICallback 接口定义的签名。
*/
post(url: string, params: Map<string, string>, callback: ICallback): void; /**
* 发送一个 get 请求到指定的 URL。
* @param url 这个回调函数遵循 ICallback 接口定义的签名。
* @param callback 一个回调函数,用于处理请求完成后的结果。
* 这个回调函数遵循 ICallback 接口定义的签名。
*/
get(url: string, callback: ICallback): void;
}

HTTP请求处理 (HttpHelper)

  • HttpHelper类实现了单例模式,用于管理网络请求。
  • 提供了init方法来初始化网络请求处理器。
  • post和get方法用于发送POST和GET请求,它们代理到具体的网络请求处理器。
import { ICallback } from './ICallback';
import { IHttpRequest } from './IHttpRequest';
/**
* 代理类,用于网络请求管理
*/
export class HttpHelper implements IHttpRequest {
/**
* 存储 IHttpProcessor 接口的实际实现。
* 这个属性由 init 方法设置,用于指定 HttpHelper 应该代理到哪个具体的网络请求处理器。
*/
private static mIHttpProcessor: IHttpRequest; /**
* 私有构造函数,防止外部直接通过 new 关键字创建实例。
*/
constructor() {
// 初始化逻辑可以在这里实现
} //单例
private static instance: HttpHelper; /**
* 获取 HttpHelper 的单例实例。
* @returns {HttpHelper} HttpHelper 的单例实例。
*/
public static obtain(): HttpHelper {
if (!HttpHelper.instance) {
HttpHelper.instance = new HttpHelper();
}
return HttpHelper.instance;
} /**
* 初始化代理类,设置它应该使用的网络请求处理器。
* @param httpProcessor 实现 IHttpProcessor 接口的对象。
*/
public static init(httpProcessor: IHttpRequest): void {
HttpHelper.mIHttpProcessor = httpProcessor;
} /**
* 发送一个 POST 请求。
* 这个方法代理到 mIHttpProcessor 的 post 方法,实现了网络请求的功能。
* @param url 请求的 URL 地址。
* @param params 包含请求参数的 Map 对象。
* @param callback 处理请求结果的回调函数。
*/
post(url: string, params: Map<string, string>, callback: ICallback): void {
// 代理到 IHttpProcessor 实例的 post 方法
HttpHelper.mIHttpProcessor.post(url, params, callback);
} /**
* 发送一个 get 请求。
* 这个方法代理到 mIHttpProcessor 的 get 方法,实现了网络请求的功能。
* @param url 请求的 URL 地址。
* @param callback 处理请求结果的回调函数。
*/
get(url: string, callback: ICallback): void {
// 代理到 IHttpProcessor 实例的 get 方法
HttpHelper.mIHttpProcessor.get(url, callback);
}
}

具体的网络实现 (HttptoolRequest)

  • HttptoolRequest类是IHttpRequest的一个具体实现,使用了三方网络请求库(httptool)来发送网络请求。
  • 它实现了post和get方法,用于处理POST和GET请求,并使用回调来处理响应。
import http from '@ohos.net.http';
import { HttpManager } from '@xufeng/httptool/src/main/ets/http/HttpManager';
import { RequestMethod } from '@xufeng/httptool/src/main/ets/http/RequestOptions';
import { HomePageNewIndexBean } from '@xufeng/httptool/src/main/ets/model/NewsModel';
import { Tongue } from '../bean/Tongue';
import { ICallback } from './ICallback';
import { IHttpRequest } from './IHttpRequest'; /**
* HttptoolRequest 类实现了 IHttpRequest 接口,用于执行网络 POST 请求。
* 可以使用第三方 SDK 来处理实际的网络请求。
*/
export class HttptoolRequest implements IHttpRequest {
/**
* 发送一个 POST 请求到指定的 URL,并处理响应。
*
* @param url 请求的目标 URL 地址。
* @param params 一个 Map 对象,包含了请求的参数。
* @param callback 实现 ICallback 接口的回调函数,用于处理请求完成后的结果。
*/
post(url: string, params: Map<string, string>, callback: ICallback): void { let headers: Record<string, string> = {
"X-APISpace-Token": 'X-APISpace-Token信息',
"Content-Type": 'application/x-www-form-urlencoded',
};
HttpManager.getInstance().request<string>({
method: RequestMethod.POST,
url: url,
header: headers,
extraData:params
}).then((response) => {
console.log("response:" + JSON.stringify(response))
callback.onSuccess(JSON.stringify(response)) }).catch((err) => {
console.log("err:" + JSON.stringify(err))
callback.onFailure(JSON.stringify(err))
})
} /**
* 发送一个 get 请求到指定的 URL,并处理响应。
*
* @param url 请求的目标 URL 地址。
* @param params 一个 Map 对象,包含了请求的参数。
* @param callback 实现 ICallback 接口的回调函数,用于处理请求完成后的结果。
*/
get(url: string, callback: ICallback): void {
HttpManager.getInstance().request<string>({
method: RequestMethod.GET,
url: url
}).then((response) => {
console.log("response:" + JSON.stringify(response))
callback.onSuccess(JSON.stringify(response)) }).catch((err) => {
console.log("err:" + JSON.stringify(err))
callback.onFailure(JSON.stringify(err))
})
}
}

业务层调用

通过HttpHelper初始化使用的三方网络请求处理器,并发送POST请求。

HttpHelper.init(new HttptoolRequest());
let postURL: string = 'https://eolink.o.apispace.com/rkl/common/tongue/getTongueList'
let params: Map<string, string> = new Map<string, string>();
params.set('pageSize', '5')
params.set('page', '1')
HttpHelper.obtain().post(postURL, params, new (class Http extends HttpCallback<Tongue> {
onParsedSuccess(tongue: Tongue): void {
console.log("tongue==========" + JSON.stringify(tongue));
}
}));

HarmonyOS 鸿蒙隔离层设计的更多相关文章

  1. 华为:harmonyos 鸿蒙

    鸿蒙 1.设置--更新 2.华为搜索--抢鲜体验-下载描述文件--同意 3.更新-安装

  2. 华为 鸿蒙系统(HarmonyOS)

    HarmonyOS Ⅰ. 鸿蒙系统简介 鸿蒙系统(HarmonyOS),是第一款基于微内核的全场景分布式OS,是华为自主研发的操作系统.2019年8月9日,鸿蒙系统在华为开发者大会<HDC.20 ...

  3. 乘风破浪,遇见华为鸿蒙智能终端系统(HarmonyOS 2),打造面向全场景的分布式操作系统

    什么是鸿蒙智能终端系统(HarmonyOS 2) HarmonyOS 是新一代的智能终端操作系统,为不同设备的智能化.互联与协同提供了统一的语言.带来简洁,流畅,连续,安全可靠的全场景交互体验. ht ...

  4. 最全华为鸿蒙 HarmonyOS 开发资料汇总

    开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...

  5. [github] 关于华为鸿蒙OS

    English Docs | 中文文档 | Türkçe Dökümanlar HarmonyOS Ⅰ. 鸿蒙系统简介 鸿蒙系统(HarmonyOS),是第一款基于微内核的全场景分布式OS,是华为自主 ...

  6. 为鸿蒙OS说两句公道话(我对鸿蒙OS的一些看法)

    为鸿蒙说两句公道话 今天看了鸿蒙系统的评测,看完后我感觉很欣慰,为什么这么说 ? 不是很多人吐槽鸿蒙是 Android 套壳吗 ?或者叫鸿蒙 UI 吗?说鸿蒙没有自己的核心技术.看了鸿蒙系统的设计,底 ...

  7. 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【一】

    基于小熊派鸿蒙季BearPi-HM_Nano HarmonyOS 鸿蒙系统Hi3861开发板NFC  开发步骤:1.购买开发板:某宝上购买就行 2.安装开发环境 3.下载源码 4.编写案例并执行 开发 ...

  8. 【智简联接,万物互联】华为云·云享专家董昕:Serverless和微服务下, IoT的变革蓄势待发

    摘要:Serverless.微服务,这些新技术和IoT有什么关系?纵观IoT行业的发展,云服务又扮演了什么角色? IoT并不是一个新名词.新技术,很长一段时间,它甚至给人一种"下工地&quo ...

  9. 抢先学鸿蒙(HarmonyOS)2.0,你就是下一个大咖!

        1. 你不知道的鸿蒙(HarmonyOS)   2020年9月10日,华为开发者大会发布了鸿蒙(HarmonyOS)2.0.我在2020-9-11日也发布了全球首套鸿蒙2.0 App开发视频课 ...

  10. 鸿蒙HarmonyOS应用开发落地实践,Harmony Go 技术沙龙落地北京

    12月26日,华为消费者BG软件部开源中心与51CTO Harmony OS技术社区携手,共同主办了主题为"Harmony OS 应用开发落地实践"的 Harmony Go 技术沙 ...

随机推荐

  1. swagger的使用及配置

    引入坐标 <!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifac ...

  2. .Net单元测试xUnit和集成测试指南(1)

    引言 在现代化的软件开发中,单元测试和集成测试是确保代码质量和可靠性的关键部分.ASP.NET Core 社区内提供了强大的单元测试框架,xUnit 是其中之一,它提供了简单.清晰和强大的测试功能,编 ...

  3. #贪心#CF1054D Changing Array

    题目 给定 \(n\) 个 \(k\) 位二进制数,\(n\leq 2*10^5,k\leq 30\) 可以选择若干数将其所有二进制位取反, 最多可以有多少个区间的异或和不为 0 分析 考虑将区间异或 ...

  4. OpenHarmony标准系统开机时长优化

    简介 万物互联时代,产品性能至关重要,而系统启动时间是系统性能的重要组成部分,因为用户必须等待系统启动完成后才能使用设备.对于经常需要进行冷启动的汽车等设备而言,较短的启动时间至关重要(没有人喜欢在等 ...

  5. HMS Core上新啦!

    HMS Core上新啦!分析服务营销分析报告全新上线:运动健康服务支持目标场景事件订阅:音频编辑服务提供专业的三维声音频编辑与渲染能力,更多HMS Core能力可点击网页链接了解. 了解更多详情> ...

  6. IE8页面失去焦点,动态删除element

    当页面失去焦点(切换到其他标签页 / 切换到其他软件),触发失焦事件,然后动态删除element 兼容IE8 if(window.ActiveXObject){ window.attachEvent( ...

  7. Native Drawing开发指导,实现HarmonyOS基本图形和字体的绘制

      场景介绍 Native Drawing模块提供了一系列的接口用于基本图形和字体的绘制.常见的应用场景举例: ● 2D图形绘制. ● 文本绘制. 接口说明 接口名 描述 OH_Drawing_Bit ...

  8. 鸿蒙开发套件之DevEco Profiler助您轻松分析应用性能问题

     作者:shizhengtao,华为性能调优工具专家 应用的性能优化一直以来都是开发者所面临的一大难题,在2023HDC大会上全新亮相的HarmonyOS NEXT开发者预览版,其中鸿蒙开发套件Dev ...

  9. k8s之存储卷local PV

    一.简介 local能够作为PV使用的本地存储卷. local卷插件用于将本地存储设备(如磁盘.分区或目录) 配置为卷. hostPath卷在Pod被重建后可能被调试至其它节点而无法再次使用此前的数据 ...

  10. Hadoop之Hive架构与设计

    Hadoop之Hive架构与设计 Hadoop是一个能够对大量数据进行分布式处理的软件框架.具有可靠.高效.可伸缩的特点. HDFS:全称为Hadoop分布式文件系统(Hadoop Distribut ...