当前位置: 首页 > news >正文

鸿蒙Harmony应用开发,数据驾驶舱网络请求(Axios) 封装

鸿蒙Harmony应用开发,数据驾驶舱网络请求(Axios) 封装

在进行网络请求的封装之前,先来分析一下我们项目所用到的接口的基本情况: 1. 在请求的接口中添加了签名。

2.在非登录接口中添加了token。 基于以上基本的情况。我们开始来对Axios做封装。

首先我们需要在根目录的oh-package.json5文件的dependencies中添加 axios的依赖

"@ohos/axios": "^2.1.1",

前面我们已经介绍了我们的接口请求中的2个必要因素是签名和token,现在我们开始对这2块的实现开始介绍

  • 签名的生成

    我们的签名是将当前所有的请求参数加上当前的时间戳来生成的签名,所以们把请求中的参数做遍历放到一个数组中

    在添加一个当前时间戳,以及生成的签名作为新的请求参数

private generateSignature(params: RequestParams): RequestParams {const time = Date.now().toString().substr(0, 10);let str = pref + "&";
​const allParams: RequestParams = {};Object.keys(params).forEach((key) => {allParams[key] = params[key];});allParams['timestamp'] = time;
​const sortedKeys = Object.keys(allParams).sort();
​sortedKeys.forEach((key) => {const value = allParams[key];if (typeof value !== 'object' && value !== null) {if (key === "timestamp") {str += `${key}=${time}&`;} else if (key !== "sign") {str += `${key}=${decodeURIComponent(String(value))}&`;}}});str += suff;allParams['sign'] = CryptoJS.MD5(str).toString()return allParams
}
  • 请求头token

    我们在登录接口获取到token后存储到preferences中,然后在再请求头添加类似的代码

    headers.set('Authorization', token);
    

接下来我们创建一个PolarisHttp.ets开始对基本的get ,post ,put,patch等方法的封装

首先我们需要创建一个网络请求对象 PolarisHttpRequest,定义基础的变量

config: HttpRequestConfig;  //请求配置参数
interceptorHooks?: InterceptorHooks; //拦截器
instance: AxiosInstance; //阿修罗实例

阿修罗网络请求核心代码:

request<T = CommonType>(config: HttpRequestConfig): Promise<T> {return new Promise<T>((resolve, reject) => {this.instance.request<CommonType, T>(config).then(res => {resolve(res);}).catch((err: Error) => {LogUtils.error("网络请求Request异常:", err.toString());if (err instanceof AxiosError) {showToast(err.message)}reject(err);});});
}
  • GET 请求封装:

    public get<T = CommonType>(config: HttpRequestConfig): Promise<T> {// 确保 params 存在if (!config.params) {config.params = {};}
    ​const allParams: RequestParams = this.generateSignature(config.params);// Object.keys(config.params).forEach(key => {//   allParams[key] = config.params[key];// });// 创建新的 headers 对象const headers = new AxiosHeaders(config.headers);return new Promise<T>((resolve, reject) => {const getTokenAndSendRequest = () => {if (!config.isLoginState) {UserLoginHelper.getUserToken().then(token => {if (token && typeof token === 'string') {LogUtils.error('网络请求Request Authorization', token);headers.set('Authorization', token);} else {LogUtils.error('网络请求Request 请求未获取的Token信息');}sendRequest();}).catch(reject);} else {sendRequest();}};const sendRequest = () => {// 构建新的配置对象const newConfig: HttpRequestConfig = {method: 'GET',url: config.url,params: allParams,headers: headers,data: config.data,timeout: config.timeout,responseType: config.responseType};// 发送请求this.request<T>(newConfig).then(resolve).catch(reject);};getTokenAndSendRequest();});
    }
    
  • POST请求封装:

    public post<T = CommonType>(config: HttpRequestConfig): Promise<T> {// 确保 data 存在if (!config.data) {config.data = {};}let allData: RequestParams = {};// 复制原有数据Object.keys(config.data).forEach(key => {allData[key] = config.data[key];});// 使用 generateSignature 方法生成签名allData = this.generateSignature(allData);// 创建新的 headers 对象const headers = new AxiosHeaders(config.headers);
    ​// 使用Promise来处理异步token获取return new Promise<T>((resolve, reject) => {const getTokenAndSendRequest = () => {if (!config.isLoginState) {LogUtils.error('网络请求Request--Authorization...token..!config.isLoginState');UserLoginHelper.getUserToken().then(token => {if (token && typeof token === 'string') {LogUtils.error('网络请求Request--Authorization', token);headers.set('Authorization', token);} else {LogUtils.error('网络请求Request--Authorization--请求未获取的Token信息');}sendRequest();}).catch(reject);} else {LogUtils.error('网络请求Request--Authorization...token..config.isLoginState');sendRequest();}};const sendRequest = () => {// 构建新的配置对象const newConfig: HttpRequestConfig = {method: 'POST',url: config.url,data: allData,headers: headers,timeout: config.timeout,responseType: config.responseType};// 发送请求this.request<T>(newConfig).then(resolve).catch(reject);};getTokenAndSendRequest();});
    ​
    ​// // 构建新的配置对象// const newConfig: HttpRequestConfig = {//   method: 'POST',//   url: config.url,//   data: allData,//   headers: headers,//   timeout: config.timeout,//   responseType: config.responseType// };// // 返回请求// return this.request<T>(newConfig);
    }
    

我们可以看到上述的get 请求和post请求都用了2次回调,因为我们的 preferences数据的获取是一个异步过程(因为js我不是很熟悉如果你有好的实现,也可以分享下) 我们需要先异步获取到token 然后在添加到请求头中当中去.

使用示例

const httpClient = new PolarisHttpRequest({baseURL: 'https://api.example.com',timeout: 5000,interceptorHooks: {requestInterceptor: (config) => {// 请求拦截逻辑return config;},responseInterceptor: (response) => {// 响应拦截逻辑return response;}}
});
​
// GET请求示例
httpClient.get<ApiResponse<UserInfo>>({url: '/user/info',params: { userId: 123 }
}).then(response => {console.log(response.data);
}).catch(error => {console.error(error);
});
​
// POST请求示例
httpClient.post<ApiResponse<LoginResult>>({url: '/user/login',data: { username: 'example', password: 'password' }
}).then(response => {console.log(response.data);
}).catch(error => {console.error(error);
});

注意事项

  1. 确保在使用前正确配置baseURL和其他必要的选项。
  2. generateSignature方法使用了特定的签名算法,请根据实际需求调整。
  3. 对于不同的环境(开发、测试、生产),可能需要不同的配置,建议使用环境变量或配置文件管理。

至此,您可以在ArkTS应用中更加方便地管理和发送HTTP请求,同时保证了请求的安全性和一致性。封装类提供的拦截器和错误处理机制可以大大简化API调用的复杂度。

完整项目下载地址

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据库事务的详解
  • Apache Cordova开发教程-入门基础
  • eth-trunk 笔记
  • 电源模块启动过冲测试项目该如何在ATECLOUD中搭建?
  • a√斗地主之顺子
  • 传输层协议——udp/tcp
  • STL,智能指针和线程安全,线程安全的单例模式和懒汉饿汉的实现,以及读者写者问题
  • 如何用 Helm Chart 安装指定版本的 GitLab Runner?
  • 安卓手机安装Termux,变成linux服务器
  • Python 数学建模——Pearson/Spearman 相关系数
  • linux高级
  • 磁光阱的原理与搭建操作
  • 海康威视相机在QTcreate上的使用教程
  • pycharm 安装对应python版本的pip
  • Linux C高级 day1
  • python3.6+scrapy+mysql 爬虫实战
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【347天】每日项目总结系列085(2018.01.18)
  • Angular 响应式表单之下拉框
  • Babel配置的不完全指南
  • CAP理论的例子讲解
  • CSS中外联样式表代表的含义
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • E-HPC支持多队列管理和自动伸缩
  • EOS是什么
  • ES6 ...操作符
  • JAVA之继承和多态
  • Markdown 语法简单说明
  • Phpstorm怎样批量删除空行?
  • vuex 笔记整理
  • 对超线程几个不同角度的解释
  • 复习Javascript专题(四):js中的深浅拷贝
  • 关于使用markdown的方法(引自CSDN教程)
  • 利用jquery编写加法运算验证码
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 手写双向链表LinkedList的几个常用功能
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • #include<初见C语言之指针(5)>
  • (02)Unity使用在线AI大模型(调用Python)
  • (2)空速传感器
  • (7) cmake 编译C++程序(二)
  • (补)B+树一些思想
  • (简单) HDU 2612 Find a way,BFS。
  • (强烈推荐)移动端音视频从零到上手(下)
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .net core Swagger 过滤部分Api
  • .Net Memory Profiler的使用举例
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • ??Nginx实现会话保持_Nginx会话保持与Redis的结合_Nginx实现四层负载均衡
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Pointcut 使用
  • [12] 使用 CUDA 加速排序算法
  • [14]内置对象