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

news2024/9/20 14:59:24

 一、为什么要对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) { //请求200
          if (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) { //请求200
          if (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.coloradmin.cn/o/1858454.html

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

相关文章

基于YOLOv5的交通标志检测的设计与实现(PyQT页面+YOLOv5模型+数据集)

简介 在智能交通系统中,交通标志的准确检测与识别对提高道路安全和交通效率至关重要。为了实现这一目标,我们开发了一种基于YOLOv5目标检测模型的交通标志检测系统。本报告将详细介绍该系统的实际应用与实现,包括系统架构、功能实现、使用说明、检测示例、数据集获取与介绍…

【数据结构与算法 经典例题】使用栈实现队列(图文详解)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 目录 ​​一、问题描述 二、前置知识 三、解题思路 原理&#xff1a; 图解&…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十六)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 25 - 26 节&#xff09; P25《24.Stage模型-UIAblity生命周期》 stage之所以叫这个名字&#xff0c;是因为它在运行时&#xff0…

骚操作:如何让一个网页一直处于空白情况?

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 如题&#xff0c;惯性思路很简单&#xff0c;就是直接撸上一个空内容的html。 注&#xff1a;以下都是在现代浏览器中执行&#xff0c;主要为**Chrome 版本 120.0.6099.217&…

TPS61085非同步650kHz,1.2MHz, 18.5V升压DCDC芯片

1 特点 TPS61085外观和丝印PMKI 2.3 V 至 6 V 输入电压范围 具有 2.0A 开关电流的 18.5V 升压转换器 650kHz/1.2MHz 可选开关频率 可调软启动 热关断 欠压闭锁 8引脚VSSOP封装 8引脚TSSOP封装 2 应用 手持设备 GPS接收器 数码相机 便携式应用 DSL调制解调器 PCMCIA卡 TFT LCD…

ChatGPT API教程在线对接OpenAI APIKey技术教程

一、OpenAI基本库介绍 您可以通过 HTTP 请求与 API 进行交互&#xff0c;这可以通过任何编程语言实现。我们提供官方的 Python 绑定、官方的 Node.js 库&#xff0c;以及由社区维护的库。 要安装官方的 Python 绑定&#xff0c;请运行以下命令&#xff1a; pip install open…

全国计算机二级C++题库笔记

全国计算机二级C题库笔记 Ⅰ. 选择题专项训练1 公共基础部分2 二级C程序设计第1~4章》每章标题1. C标识符命名规则2. 面向对象的三个主要特征3. C的四个开发步骤4. 关于类和对象的叙述5. !和&&的作用6. C枚举类型初值问题7. ASCII码对照表8. 运算符两边的数据类型&…

ONLYOFFICE 8.1版本桌面编辑器深度体验:创新功能与卓越性能的结合

ONLYOFFICE 8.1版本桌面编辑器深度体验&#xff1a;创新功能与卓越性能的结合 随着数字化办公的日益普及&#xff0c;一款高效、功能丰富的办公软件成为了职场人士的必备工具。ONLYOFFICE团队一直致力于为用户提供全面而先进的办公解决方案。最新推出的ONLYOFFICE 8.1版本桌面编…

08.QT控件:QWidget

一、Widget 简介 Widget 是 Qt 中的核⼼概念.。英⽂原意是 "小部件"&#xff0c;我们此处也把它翻译为 "控件"。控件是构成⼀个图形化界⾯的基本要素。 Qt 作为⼀个成熟的 GUI 开发框架, 内置了⼤量的常⽤控件。并且 Qt 也提供了 "⾃定义控件" 的…

C和C++实现stack的对比

本篇文章&#xff0c;我们将对比C语言和C实现栈的不同来体会C的魅力&#xff01; 1.栈的介绍 栈&#xff08;Stack&#xff09;是一种常见的数据结构&#xff0c;它是一种特殊的线性表&#xff0c;只允许在一端进行数据的插入和删除操作。这一端通常被称为栈顶&#xff08;Top…

移位操作符

目录 移位 >> --- 右移操作符 右移操作符代码的使用 代码验证 算术右移和逻辑右移 验证Visual Studio使用的是算术右移还是逻辑右移 逻辑右移 or 算术右移的代码验证 右移操作符对正整数有除2的效果&#xff08;除2是整数除法的除2&#xff09; 验证 << -…

Day3:203 移除链表元素 707设计链表 206反转链表

题目&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* …

[数据集][目标检测]棉花检测数据集VOC+YOLO格式389张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;389 标注数量(xml文件个数)&#xff1a;389 标注数量(txt文件个数)&#xff1a;389 标注类别…

Excel如果将一个表格拆分为多个表格,文末另赠彩蛋!

前期分享如何用数据透视表将一个表格拆分成多个工作薄Excel一个表格拆分多个表格&#xff0c;你学会了吗&#xff1f; 今天刘小生分享另外一种&#xff0c;如果拆分成多个工作表格文件&#xff01; 如何将一个表格根据部门进行拆分成多个表格&#xff0c;再点对点发送给各部门…

浅析Vite本地构建原理

前言 随着Vue3的逐渐普及以及Vite的逐渐成熟&#xff0c;我们有必要来了解一下关于vite的本地构建原理。 对于webpack打包的核心流程是通过分析JS文件中引用关系&#xff0c;通过递归得到整个项目的依赖关系&#xff0c;并且对于非JS类型的资源&#xff0c;通过调用对应的loade…

宝宝早教电子图书 酷得电子方案

宝宝早教发声书是一种专为婴幼儿设计的图书&#xff0c;旨在通过有趣的图画和声音来吸引宝宝的注意力&#xff0c;帮助他们学习语言、认知和发展各种技能。这类书籍通常包括以下特点&#xff1a; 鲜艳的图画&#xff1a;发声书通常配有色彩鲜艳、形象生动的图画&#xff0c;以…

什么美业系统好用?美业门店收银系统源码分享、小程序展示

专业美业系统与普通系统相比&#xff0c;更加贴合美业门店的经营需求&#xff0c;提供了更全面、便捷、高效的管理功能&#xff0c;有助于提升门店的服务质量和经营效益。 博弈美业系统包括PC、iPad、手机、小程序四大端口&#xff0c;满足不同人群的各种需求。客户可从小程序…

使用Leaflet和瓦片地图实现离线地图的技术指南

引言 在现代的Web应用中&#xff0c;地图服务扮演着越来越重要的角色。然而&#xff0c;在一些特殊环境下&#xff0c;如偏远地区或网络环境不稳定的情况下&#xff0c;依赖在线地图服务可能会受到限制。因此&#xff0c;实现离线地图功能成为了一个重要的需求。本文将介绍如何…

Jenkins定时构建自动化(四):Python 的 argparse 模块

目录 一、主要功能和用途 二、核心类和方法 三、总结 四、argparse模块示例 Jenkins定时构建自动化(一)&#xff1a;Jenkins下载安装配置-CSDN博客 Jenkins定时构建自动化(二)&#xff1a;Jenkins的定时构建-CSDN博客 Jenkins定时构建自动化(三)&#xff1a;手动定时构建…

【服务器08】之【游戏框架】之【加载主角】

首先简单了解一下帧率 FixedUpdate( ) > Update( ) > LateUpdate( ) 首先FixedUpdate的设置值 默认一秒运行50次 虽然默认是0.02秒&#xff0c;但FiexedUpdate并不是真的0.02秒调用一次&#xff0c;因为在脚本的生命周期内&#xff0c;FixedUpdate有一个小循环&…