鸿蒙NEXT实战开发: 依据前端对http请求进行二次简单封装

 一、为什么要对http请求进行封装?

在我看来二次封装有一下几点好处

  • 代码封装之后,开发人员只用关注业务层面的东西,不用去过多浪费时间在接口请求数据处理上。
  • 封装之后代码更加简洁,通俗易懂,方便后期维护,统一管理。
  • 对经验不足的开发人员友好,只需要依葫芦画瓢,参照之前的例子就可以进行开发。
  • 随着团队规模变大,代码封装之后,减少代码冗余,防止屎山代码。
  • 统一处理token修改配置项,统一对数据错误和数据返回进行处理提示等。

二、注意事项

  • 使用HTTP数据请求需要申请ohos.permission.INTERNET权限权,限申请请参考访问控制(权限)开发指导。
  • 此次封装功能并没有像axios 里面一样有响应拦截器和请求拦截前。
  • 没有取消重复请求、错误请求重连的功能,所以只适合较小的项目。

三、开始进行封装

1. 创建请求实体类

在ets/common/utils下创建文件request.ets


import http from '@ohos.net.http';export  interface  httpConfig{url:string;method:http.RequestMethod;timeOut?: number;data?: string | Object | ArrayBuffer;header?: Object;expectDataType?: http.HttpDataType;
}
interface HttpResponse{code:string|number;message:string;data:string|Object|unknown[]
}export default  (config: httpConfig): Promise<HttpResponse>=> {// 创建请求实例const service = http.createHttp();}
2. 对请求实体类进行 Promise 封装

这里面加入了Authorization 身份信息、 Content-Type响应方式、connectTimeout连接超时等 自己需要根据实际业务情况更换


import http from '@ohos.net.http';export  interface  httpConfig{url:string;method:http.RequestMethod;timeOut?: number;data?: string | Object | ArrayBuffer;header?: Object;expectDataType?: http.HttpDataType;
}
interface HttpResponse{code:string|number;message:string;data:string|Object|unknown[]
}export default  (config: httpConfig): Promise<HttpResponse>=> {// 创建请求实例const service = http.createHttp();//请求地址const url ='http://XXX.XXX' +config.url;return new Promise((resolve, reject) => {service.request(url,{method: config.method,expectDataType: config.expectDataType, //数据类型header: {"Content-Type":"application/json",//header中存放身份信息Authorization:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",...config.header,},extraData: config.data,readTimeout:config.timeOut|| 50000,connectTimeout:config.timeOut|| 50000},(err, response)=>{if (!err && response.responseCode === 200) { //请求200if (typeof response.result === 'string') {const resData=  JSON.parse(response.result)if(resData.code==2001){ //接口状态成功resolve(resData)}else{// 接口约定好的状态码 例如登录过期 等等reject(response)}} else {//接口返回数据异常reject(response)}} else {// 状态码异常 例如 404 502 503 等等// 请求失败通常是后端问题或者网络问题reject(response)}})})}
3. 封装一个公共提示框

                                     

在 ets/common/utils 下创建文件DialogUtils.ets 内容如下

/*** This is a pop-up window tool class, which is used to encapsulate dialog code.* Developers can directly invoke the methods in.*/
export class DialogUtils {/*** 轻提示*/toast(content:{message:string}) {AlertDialog.show({message: content.message,alignment: DialogAlignment.Center,primaryButton: {value: '取消',action: () => {}},secondaryButton: {value: '确认',action: () => {}}});}}export default new DialogUtils();
4. 在请求里面多错误状态进行相应判断处理提示

import http from '@ohos.net.http';
import  DialogUtils from "./DialogUtils"
export  interface  httpConfig{url:string;method:http.RequestMethod;timeOut?: number;data?: string | Object | ArrayBuffer;header?: Object;expectDataType?: http.HttpDataType;
}
interface HttpResponse{code:string|number;message:string;data:string|Object|unknown[]
}export default  (config: httpConfig): Promise<HttpResponse>=> {// 创建请求实例const service = http.createHttp();//请求地址const url ='http://XXX.XXX' +config.url;return new Promise((resolve, reject) => {service.request(url,{method: config.method,expectDataType: config.expectDataType, //数据类型header: {"Content-Type":"application/json",//header中存放身份信息Authorization:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",...config.header,},extraData: config.data,readTimeout:config.timeOut|| 50000,connectTimeout:config.timeOut|| 50000},(err, response)=>{if (!err && response.responseCode === 200) { //请求200if (typeof response.result === 'string') {const resData=  JSON.parse(response.result)if(resData.code==2001){ //接口状态成功resolve(resData)}else{// 接口约定好的状态码 例如登录过期 等等DialogUtils.toast({message:'身份信息已失效,请重新登录'})reject(response)}} else {//接口返回数据异常DialogUtils.toast({message:'网络请求错误,请稍后再试'})reject(response)}} else {// 状态码异常 例如 404 502 503 等等// 请求失败通常是后端问题或者网络问题checkStatus(response.responseCode)reject(response)}})})function  checkStatus(status: number): void {let errMessage = '';switch (status) {case 400:errMessage =  '网络请求超时!';break;case 401:errMessage =  '用户没有权限(令牌、用户名、密码错误)!';break;case 403:errMessage = '用户得到授权,但是访问是被禁止的!';break;case 404:errMessage = '网络请求错误,未找到该资源!';break;case 405:errMessage = '网络请求错误,请求方法未允许!';break;case 408:errMessage = '网络请求超时!';break;case 500:errMessage = '服务器错误,请联系管理员!';break;case 501:errMessage = '网络未实现!';break;case 502:errMessage = '网络错误!';break;case 503:errMessage = '服务不可用,服务器暂时过载或维护!';break;case 504:errMessage = '网络超时!';break;case 505:errMessage = 'http版本不支持该请求!';break;default:}if (errMessage) {// 进行错误提示console.log('errMessage',errMessage)DialogUtils.toast({message:errMessage})}
}}

5. 封装业务接口

在ets/common/api下创建文件 index.ets 自己要根据实际业务进行调整这里只是示例 ,我在这里封装了一个 GET 一个POST 请求。

import request from "../utils/request";
import http from '@ohos.net.http';
// 数据列表
export const listByCondition = (data:Record<string, string|number>) => {return request({url: "/wms/isoftstone-form-onlineoperation/listByCondition",method: http.RequestMethod.POST,data:data});
};
// 字典列表
export const dictList = (data:Record<string, string|number>) => {return request({url: "/wms/dict/list2",method: http.RequestMethod.GET,data:data});
};
6. 项目中使用且请求接口

                                            

在ets/pages/Index.ets 页面写入以下代码进行测试

import  {listByCondition,dictList} from "../common/api/index"@Entry
@Component
struct Index {@State listData:unknown[] = [];//数据列表@State dicData:unknown[] = [];//字典列表// 获取数据列表async  getListByCondition(){let res = await listByCondition({"tableName":"cd_warehouse","columnName":"park_code","columnValue":"DCYQ01","filterType":1});this.listData = res.data as unknown[];};// 获取字典async getDictList(){let res = await dictList({"code":"SYS_WMS_WORK_TYPE",});this.dicData = res.data as unknown[];};onPageShow(){this.getListByCondition();this.getDictList();};build() {Column(){Column(){ForEach(this.listData, (item) => {Row(){Text(item.wh_code)Text(item.cdwh_name)}})}Column(){ForEach(this.dicData, (item) => {Row(){Text(item.value)Text(item.label)}})}}.height('100%')}
}

到这里对http请求二次封装就已经基本完成,本文只做了一些简单封装,主要是按照前端开发习惯进行封装,大家有需要可以参考学习。



最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?但是又不知道从哪里下手,而且学习时频繁踩坑,最终浪费大量时间。所以本人整理了一些比较合适的鸿蒙(HarmonyOS NEXT)学习路径和一些资料的整理供小伙伴学习

点击领取→纯血鸿蒙Next全套最新学习资料(安全链接,放心点击

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

一、鸿蒙(HarmonyOS NEXT)最新学习路线

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)…等技术知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

二、HarmonyOS Next 最新全套视频教程

三、《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

四、大厂面试必问面试题

五、鸿蒙南向开发技术

六、鸿蒙APP开发必备

七、鸿蒙生态应用开发白皮书V2.0PDF


完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

                        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/360365.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务中的相关概念

Eureka Eureka 是由 Netflix 开发的一个服务发现和注册中心&#xff0c;广泛应用于微服务架构中。Eureka 主要用于管理和协调分布式服务的注册和发现&#xff0c;确保各个服务之间能够方便地找到并通信。它是 Netflix OSS&#xff08;Netflix Open Source Software&#xff09…

OpenAI突然宣布停止向中国提供API服务!

标题 &#x1f31f; OpenAI突然宣布停止向中国提供API服务! &#x1f31f;摘要 &#x1f4dc;引言 &#x1f4e2;正文 &#x1f4dd;1. OpenAI API的重要性2. 停止服务的原因分析3. 对中国市场的影响4. 应对措施代码案例 &#x1f4c2;常见问题解答&#xff08;QA&#xff09;❓…

OpenAI禁止国区使用:免费国产大模型等你体验!

OpenAI中国停服 国产大模型免费使用 前言 OpenAI不支持中国区域访问 从6月25日开始&#xff0c;OpenAI 宣布了对中国停止提供 API 服务&#xff0c;毫无疑问的说这给国内的开发者带来了很大的不便&#xff0c;之后他们怎么去使用GPT 这类先进大模型方面遇到了难题。不过近期我们…

【ARMv8/ARMv9 硬件加速系列 3.4 -- SVE 复制指令CPY 使用介绍】

文章目录 SVE 复制指令CPYSVE 指令格式SVE 使用语法SVE CPY 使用示例SVE CPY 小结SVE 复制指令CPY CPY <Zd>.<T>, <Pg>/M, #<imm>{, <shift>}cpy 指令在 ARMv9 的

让我们聊聊网络安全中会涉及到的IP地址(IP协议)、MAC地址、路由、DNS协议(域名系统)、NAT技术(协议)、以太网帧、ARP协议

网络安全中会涉及到的IP地址&#xff08;IP协议&#xff09;、MAC地址、路由、DNS协议&#xff08;域名系统&#xff09;、NAT技术&#xff08;协议&#xff09;、以太网帧、ARP协议 一.IP地址&#xff08;IP协议&#xff09;1.IP地址&#xff08;IP协议&#xff09;的作用2.IP…

C语言·动态内存管理

1. 为什么要有动态内存管理&#xff1f; 例1&#xff1a; //固定的向内存申请4个字节 int a 10;//申请连续的一块空间 int arr[10]; 这些数据一旦声明定义之后就会在内存中有一块空间&#xff0c;这些空间都是固定的&#xff0c;为了让内存使用更加灵活&#xff0c;这时我们…

Python火焰锋动力学和浅水表面波浪偏微分方程

&#x1f3af;要点 &#x1f3af;流图可视化正弦余弦矢量场 | &#x1f3af;解空间变化边界条件二维拉普拉斯方程 | &#x1f3af;解圆柱坐标系标量场 | &#x1f3af;解一维泊松方程 | &#x1f3af;解二维扩散方程 | &#x1f3af;解火焰锋的动力学偏微分方程 | &#x1f3a…

[C#]winform基于opencvsharp实现黑白图像上色

【算法简介】 技术有时会提高艺术&#xff0c;但有时也会破坏艺术。着色黑白电影是一个可以追溯到1902年的古老想法。几十年来&#xff0c;许多电影创作者反对将黑白电影着色的想法&#xff0c;并将其视为对艺术的破坏。但今天它被接受为艺术形式的增强。该技术本身已经从艰苦…

2024年最新机动车签字授权人考试题库。

31."简易瞬态工况法"所使用的五气分析仪的温度范图:分析系统及相关部件应在&#xff08; &#xff09;。 A.0-40℃ B.0-50℃ C.0-60℃ D.-10-40℃ 答案:A 32.稀释氧传感器环境空气量程检测时的读数值位于&#xff08; &#xff09;%vol范围之外时&#xff0c;应…

[word] Word如何删除所有的空行? #职场发展#学习方法

Word如何删除所有的空行&#xff1f; 很多网友从网页复制文字粘贴到word文档后发现段落之间有空行&#xff0c;如果文字不多&#xff0c;手动删除这些空行也没有多少工作量&#xff0c;但是如果文字的字数达到成千上万&#xff0c;一个个手动删除这些空行还是很繁琐的。那么&a…

【Docker】Consul 和API

目录 一、Consul 1. 拉取镜像 2. 启动第一个consul服务&#xff1a;consul1 3. 查看consul service1 的ip地址 4. 启动第二个consul服务&#xff1a;consul2&#xff0c; 并加入consul1&#xff08;使用join命令&#xff09; 5. 启动第三个consul服务&#xff1a;consul3&…

解决ubuntu18.04 安装vscode 报依赖库错误,以及打不开终端的问题。

其实很简单&#xff0c;ubuntu18.04太老了&#xff0c;官网最新版本的vscode对ubuntu18.04会有些依赖库的问题。 一顿查资料后发现2023.11月的1.85版本正常使用&#xff0c;于是完美解决。 下载链接 Visual Studio Code November 2023 点击这里下载。 下载完成&#xff0c;…

iptables配置NAT实现端口转发

加载防火墙的内核模块 modprobe ip_tables modprobe ip_nat_ftp modprobe ip_conntrack 1.开启路由转发功能 echo net.ipv4.ip_forward 1 >> /etc/sysctl.conf sysctl -p2、将本地的端口转发到本机端口 将本机的 7777 端口转发到 6666 端口。 iptables -t nat -A PR…

MATLAB算法实战应用案例精讲-【数模应用】线性判别分析(附MATLAB、python和R语言代码实现)

目录 前言 算法原理 什么是判别分析 线性判别分析(LDA) 数学模型 二分类 多分类LDA ​编辑 算法思想: 费歇(FISHER)判别思想 贝叶斯(BAYES)判别思想 LDA算法流程 LDA与PCA对比 SPSSPRO 1、作用 2、输入输出描述 3、案例示例 4、案例数据 5、案例操作 …

java编写的界面可以调用python吗

如何使用Java调用Python程序 本文为大家介绍如何java调用python方法&#xff0c;供大家参考。 实际工程项目中可能会用到Java和python两种语言结合进行&#xff0c;这样就会涉及到一个问题&#xff0c;就是怎么用Java程序来调用已经写好的python脚本呢&#xff0c;一共有三种…

【ai】tx2 nx: trition client安装nvidia-pyindex 一直失败

系统版本的pip和python虚拟环境的pipyolov4-triton-tensorrt的master分支 官方client jetson:pip3 install --user nvidia-pyindex 不成功啊 这个是让nvidia-pyindex 拉取nvidia@tx2-nx:~$ pip3 install --user nvidia-pyindex Collecting nvidia-pyindexDownloading https://…

Elasticsearch:倒数排序融合 - Reciprocal rank fusion - 8.14

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。语法可能会在正式发布之前发生变化。Elastic 将努力修复任何问题&#xff0c;但技术预览中的功能不受官方正式发布功能的支持 SLA 约束。 倒数排序融合 (reciprocal rank fusion - RRF) 是一…

APP软件系统的开发流程

APP软件系统的开发是一个复杂的过程&#xff0c;需要多方面的知识和技能。建议选择专业的开发团队进行开发&#xff0c;以确保APP的质量和成功。APP软件系统的开发流程通常包括以下几个阶段。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

Vue-条件渲染,事件绑定指令

条件渲染指令 条件渲染指令有两种&#xff1a; 两种指令大致相似 v-ifv-show 如果v-if的值为true&#xff0c;那么显示出内容&#xff0c;v-show也是一样 如果v-if的值为false&#xff0c;那么将不创建这个指令的标签&#xff0c;v-show将隐藏此标签 <body><div id&q…

最热门的智能猫砂盆好不好用?这期统统告诉你!

身为上班族的我们&#xff0c;常常被工作和出差填满日程。忘记给猫咪铲屎也不是一次两次了。但我们必须意识到&#xff0c;不及时清理猫砂盆不仅会让猫咪感到不适&#xff0c;还可能引发泌尿系统感染、皮肤疾病等健康问题。为了解决这个问题&#xff0c;越来越多的铲屎官开始将…