鸿蒙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.mzph.cn/news/859660.shtml

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

相关文章

MUR4060PT-ASEMI逆变焊机MUR4060PT

编辑&#xff1a;ll MUR4060PT-ASEMI逆变焊机MUR4060PT 型号&#xff1a;MUR4060PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;40A 最大循环峰值反向电压&#xff08;VRRM&#x…

Nature重磅:揭开睡眠不足为什么会损害记忆力

我们的记忆力会在睡眠期间得到增强&#xff0c;海马体是大脑的记忆中心&#xff0c;而海马体尖波涟漪&#xff08;sharp-wave ripple&#xff0c;SWR&#xff09;期间觉醒体验的激活和重放被认为是记忆力得到增强的关键。睡眠不足会损害记忆力&#xff0c;然而&#xff0c;我们…

计算机组成原理笔记-第4章 存储器

第4章 存储器 笔记PDF版本已上传至Github个人仓库&#xff1a;CourseNotes&#xff0c;欢迎fork和star&#xff0c;拥抱开源&#xff0c;一起完善。 该笔记是最初是没打算发网上的&#xff0c;所以很多地方都为了自我阅读方便&#xff0c;我理解了的地方就少有解释&#xff1b…

Tomcat简介与安装

目录 一、Tomcat 简介 1、Tomcat好帮手---JDK 2、安装Tomcat & JDK 1、系统环境说明 2 、安装JDK 3、安装Tomcat 二、Tomcat目录介绍 1、tomcat主目录介绍 2、webapps目录介绍 3、Tomcat配置介绍&#xff08;conf&#xff09; 4、Tomcat的管理 5、tomcat 配置管…

24.6.16

星期一&#xff1a; 补cf global round26 C2 cf传送门 思路&#xff1a;有效操作2只有一次&#xff0c;且反转后不会再出现负数&#xff0c;即后面能贡献 2^n-i个方案&#xff0c;再乘上前面 2^(k>0的次数) 代码如下&…

GWB—200JA型引伸计标定器

GWB一200JA型引伸计标定器&#xff0c;是一种纯机械式的高精度位移测微仪器。依据JJG762—2007引伸计检定规程要求&#xff0c;专门用于对各类引伸计的标定&#xff0c;也广泛用于位移传感器的检定及相应百分表、千分表的标定。 l、本仪器由精密微分测头及测量支架组成。该标定…

vue2+webpack 和 vite+vue3 配置获取环境变量(补充)

相关涉及知识点可看小编该文章&#xff1a; nginx: 部署前端项目的详细步骤&#xff08;vue项目build打包nginx部署&#xff09;_前端工程打包部署到nginx-CSDN博客 1.vue2webpack 我们通常会在项目中看到这么两个文件(没有则自己创建&#xff0c;文件名&#xff1a;.env.***) …

C#回车按下时 如果当前焦点的下个控件为Button 则按Button。 如果不是Button则焦点移到下个控件上

需求 扫SN 扫IMEI 扫其它 就自动点打印 帮我写这个C# 函数 “ private void FormF360ColorBox_KeyDown(object sender, KeyEventArgs e)” 回车按下时 如果当前焦点的下个控件为Button 则按Button。 如果不是Button则焦点移到下个控件上。 控件的Index 顺序要设对哦。 你可以…

AI大模型战争:通用与垂直,谁将领跑未来?

文章目录 &#x1f4d1;引言一、通用大模型&#xff1a;广泛适用&#xff0c;实力不容小觑1.1 强大的泛化能力1.2 广泛的适用场景 二、垂直大模型&#xff1a;专注深度&#xff0c;精准解决问题2.1 深度专注&#xff0c;精准度高2.2 快速落地与普及 三、通用与垂直&#xff1a;…

通过焦点行事件对行值抓取改变当行状态值

我们在实际开发过程中&#xff0c;对于每一行的状态值需要有单独的变换&#xff0c;通过对特定值的判断我们可以改变其状态值&#xff0c;通过状态值的不同&#xff0c;允许用户进行不同的操作&#xff0c;本文状态值以审核为例&#xff0c;通过对AuditState列的判断&#xff0…

新建的springboot项目启动报错:找不到或无法加载主类

检查编译问题 在使用Spring Boot时&#xff0c;我们通常使用Maven或Gradle进行项目的构建和编译。如果在编译过程中出现了错误&#xff0c;可能会导致无法加载主类的问题。 在使用Maven时&#xff0c;可以尝试使用 mvn clean install 命令清理并重新构建项目。 如果使用Grad…

qt开发-12_QScrollArea

在 Qt 中&#xff0c;QScrollArea 是用于显示可以滚动内容的控件&#xff0c;通常用于处理视图中内容超出可见区域的情况。它提供了一种在有限的视窗内显示大量内容的解决方案&#xff0c;如显示大图像、长文本、多个小部件等。 常用方法和属性 setWidget(QWidget *widget)&am…

泰勒斯威夫特2022年纽约大学毕业典礼演讲:NYU‘s 2022 Commencement Speaker Taylor Swift

NYU’s 2022 Commencement Speaker Taylor Swift Link: https://www.youtube.com/watch?vOBG50aoUwlI Singer, songwriter, producer, and director Taylor Swift received a Doctor of Fine Arts, honoris causa, at the Commencement for the Class of 2022 and delivered …

RecyclerVIew->加速再减速的RecyclerVIew平滑对齐工具类SnapHelper

XML文件 ItemView的XML文件R.layout.shape_item_view <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"100dp"android:layout_heig…

一加12搞机(kernelsu+lsposed)

刷机 温馨提示&#xff1a;如果你不知道root的意义在哪&#xff0c;建议不要解锁和root&#xff0c;到时候救砖或者回锁都挺麻烦。 刷全量包 最新版的系统没有更新推送&#xff0c;所以去一加社区[0]找了个全量包来刷&#xff0c;。安装方式可以看帖子里的内容&#xff0c;说…

力扣-滑动窗口

文章目录 滑动窗口题目1-无重复字符的最长子串题目2-找到字符串中所有字母异位词 滑动窗口 滑动窗口是一种常用的算法技巧&#xff0c;适用于需要在一个数组或字符串中找出满足特定条件的连续子数组或子字符串的问题。它通过维护一个窗口范围来减少重复计算&#xff0c;从而优…

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据…

金融行业专题|某头部期货基于 K8s 原生存储构建自服务数据库云平台

为了进一步提升资源交付效率&#xff0c;不少用户都将数据库应用从物理环境迁移到容器环境。而对于 Kubernetes 部署环境&#xff0c;用户不仅需要考虑数据库在性能方面的需求&#xff0c;还要为数据存储提供更安全、可靠的高可用保障。 近期&#xff0c;某头部期货机构基于 S…

PaddleOCR C++源码编译以及demo测试

Windows10下使用PaddleOCRc 1.所需要的环境 PaddleOCR 源码文件&#xff1a;https://gitee.com/paddlepaddle/PaddleOCR &#xff08;本文选择2.6https://github.com/PaddlePaddle/PaddleOCR/archive/refs/tags/v2.6.0.zip&#xff09; opencv库&#xff1a;https://opencv…

PyTorch的环境配置和安装

PyTorch环境配置及安装 初步机器学习&#xff0c;这里记录下一些学习经过&#xff0c;之后以便于自己查看&#xff0c;同时欢迎各位大佬点评&#xff0c;本节是机器计算的一个包的安装和简单验证。 安装、使用环境 Windows环境下&#xff1a;CUDA官网使用IDM下载就很快乐&am…