HarmonyOS NEXT应用开发(一、打造最好用的网络通信模块组件)
随着HarmonyOS NEXT 的发布,越来越多的开发者开始关注如何在这个新平台上高效地进行应用开发。其中网络通信模块的封装尤为关键。纵观HarmonyOS的众多三方网络库及封装,竟没有一个简单好用的。虽然有个axios的鸿蒙版,但有点儿重了也不是很好用。本篇博文将介绍如何将uniapp中的
luch-request
网络库移植到HarmonyOS中,从而实现更简单、高效的HTTP网络通信。
为什么选择luch-request?
在HarmonyOS中,原始的ohos.net.http
接口虽然功能强大,但在实际使用中却存在一些复杂性和局限性。这使得开发者在进行网络请求时需要写更多的代码,而且处理错误、配置请求等操作也较为繁琐。而uniapp中的luch-request,使用起来特别的简单好用,且比axios更简单和轻量级,功能一点也不弱。
相较而言,luch-request
网络库的优点:
- 简洁易用:提供了易于理解的API接口,开发者可以通过简单的调用来实现复杂的网络请求。
- Promise支持:内置了Promise支持,方便与异步编程结合,提升代码的可读性和维护性。
- 请求拦截器和响应拦截器:可以方便地添加请求和响应的拦截器,用于统一处理请求头、参数和错误处理。
- 自动化的JSON数据解析:返回的数据会自动解析成JSON格式,省去了手动解析的步骤。
- 支持多种请求方式:GET、POST、PUT、DELETE等多种请求方式都能轻松实现。
luch-request
网络库地址:GitHub - lei-mu/luch-request: luch-request 是一个基于Promise 开发的uni-app跨平台、项目级别的请求库,它有更小的体积,易用的api,方便简单的自定义能力。
官网介绍:
luch-request
移植步骤
下面,我们将详细介绍如何将unIapp平台下的luch-request
网络库移植到HarmonyOS中。
步骤一:准备环境
首先,你需要在HarmonyOS项目中引入luch-request
库。我已经移植好了,发布在了Openharmony的三方库中。
移植后的gitee地址:yyz116/h_request
发布到三库库的地址:OpenHarmony三方库中心仓
注:当前该三方库1.0.1版本正在审核中。可以从gitee项目中下载源码体验,内涵单元测试及demo。
可以这样引入使用:
ohpm install @yyz116/h_requestimport Request, { HttpRequestConfig, HttpResponse } from '@yyz116/h_request'
步骤二:封装请求模块
在你的HarmonyOS项目中创建一个新的网络请求模块,例如request.js
,并在其中引入luch-request
库。你需要对库进行小幅修改,以确保其与HarmonyOS环境兼容。
import Request, { HttpRequestConfig, HttpResponse } from '@yyz116/h_request'const httpRequest = new Request();httpRequest.setConfig((config) => {// Set base configconfig.baseURL = "https://your.api.url"; // 替换为你的API地址return config;
});httpRequest.interceptors.request.use((config) => {// 可以在这里添加请求拦截器return config;
}, (error) => {return Promise.reject(error);
});httpRequest.interceptors.response.use((response) => {// 可以在这里添加响应拦截器return response.data;
}, (error) => {return Promise.reject(error);
});export default httpRequest;
步骤三:使用网络请求模块
在你的应用中,你可以通过引入request.js
来进行网络请求。
import httpRequest from './request';// 示例 GET 请求
httpRequest.get('/endpoint').then(data => {console.log("获取数据成功:", data);}).catch(error => {console.error("请求失败:", error);});// 示例 POST 请求
httpRequest.post('/endpoint', { key: 'value' }).then(data => {console.log("数据提交成功:", data);}).catch(error => {console.error("请求失败:", error);});
使用举例
// 发送post请求
http.post('api/v1/soonmovie', {start:0,count:1}).then((res:HttpResponse<Result>) => {hilog.debug(0x0000,"request",res.data.message)hilog.debug(0x0000,"request","res.data.code:%{public}d",res.data.code)}).catch((err:HttpResponse<Error>) => {hilog.debug(0x0000,"request","err.data.code:%d",err.data.code)hilog.debug(0x0000,"request",err.data.message)});// 发送get请求,带参数
http.get('api/v1/musicsearchlrc', {params:{id:"543656129",kind:"wy"}}).then((res:HttpResponse<Result>) => {hilog.debug(0x0000,"request",res.data.message)hilog.debug(0x0000,"request","res.data.code:%{public}d",res.data.code)}).catch((err:HttpResponse<Error>) => {hilog.debug(0x0000,"request","err.data.code:%d",err.data.code)hilog.debug(0x0000,"request",err.data.message)});})
可以看到,接口使用变得如此简单。 且可以增加拦截器(建议把拦截器封装到单独的一个模块文件里,以下示例仅为示例utils/request.js):
export const setRequestConfig = () => {http.setConfig((config:HttpRequestConfig) => {config.baseURL = "http://175.178.126.10:8000/";return config;});// 请求拦截http.interceptors.request.use((config) => {hilog.debug(0x0000,"request",'请求拦截')return config},(error) => {return Promise.reject(error)})// 响应拦截http.interceptors.response.use((response:HttpResponse) => {hilog.debug(0x0000,"request",'响应拦截')if (response.data.code == 401) {// 提示重新登录console.log('请登录')setTimeout(() => {console.log('请请登录')}, 1000);}return response},(error) => {return Promise.reject(error)})}
接口使用变得清晰明了,如下api封装模块user.js:
import { setRequestConfig } from '@/utils/request.js';// 调用setRequestConfig函数进行请求配置
setRequestConfig();
const http = uni.$u.http
// 发起登录请求
export const requestLogin = (data) => http.post('/wx-api/login', data);
//请求验证码 /wx-api/validcode get 参数:{"phone":"xxx"}
export const requestVerificationCode = (params = {}) => http.get(`/wx-api/validcode`, params)
//发起注册请求 /wx-api/register post
/*
参数:{"code": "xxx","phone": "xxx","verifyCode": "xxx","nickname": "xxx","avatarUrl": "xxx","gender":"0"}
*/
export const requestRegister = (data)=>http.post('/wx-api/register',data)
//获取个人中心信息 /wx-api/me/info get
export const requestUserInfo = () => http.get('/wx-api/me/info')
//修改个人昵称 /wx-api/update/nickname post 参数:newNickname
export const requestNickname = (data)=>http.post('/wx-api/update/nickname',data)
完整示例
import Request, { HttpRequestConfig, HttpResponse } from '@yyz116/h_request'
import { hilog } from '@kit.PerformanceAnalysisKit';interface Movie{id:string;cover:string;title:string;gener:string;rate:number;
}
interface Result{code:number;message:string;data:Array<Movie>;count:number;start:number;total:number;title:string;}
interface Error{code:number;message:string;data:Array<Movie>;count:number;start:number;total:number;title:string;
}@Entry
@Component
struct Index {@State message: string = 'Hello World';build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Button('test1').width(300).margin({ top: 20 }).onClick(() => {// 需要执行的操作const http = new Request();http.setConfig((config:HttpRequestConfig) => {config.baseURL = "http://175.178.126.10:8000/";return config;});// 请求拦截http.interceptors.request.use((config) => {hilog.debug(0x0000,"request",'请求拦截')return config},(error) => {return Promise.reject(error)})// 响应拦截http.interceptors.response.use((response:HttpResponse) => {hilog.debug(0x0000,"request",'响应拦截')if (response.data.code == 401) {// 提示重新登录console.log('请登录')setTimeout(() => {console.log('请请登录')}, 1000);}return response},(error) => {return Promise.reject(error)})http.post('api/v1/soonmovie', {start:0,count:1}).then((res:HttpResponse<Result>) => {hilog.debug(0x0000,"request",res.data.message)hilog.debug(0x0000,"request","res.data.code:%{public}d",res.data.code)}).catch((err:HttpResponse<Error>) => {hilog.debug(0x0000,"request","err.data.code:%d",err.data.code)hilog.debug(0x0000,"request",err.data.message)});http.get('api/v1/musicsearchlrc', {params:{id:"543656129",kind:"wy"}}).then((res:HttpResponse<Result>) => {hilog.debug(0x0000,"request",res.data.message)hilog.debug(0x0000,"request","res.data.code:%{public}d",res.data.code)}).catch((err:HttpResponse<Error>) => {hilog.debug(0x0000,"request","err.data.code:%d",err.data.code)hilog.debug(0x0000,"request",err.data.message)});})}.width('100%')}.height('100%')}
}
总结
通过将luch-request
网络库移植到HarmonyOS,我们大大简化了网络请求的过程。开发者可以享受到更加清晰、简洁的API,同时也提升了开发效率。如果你正在开发HarmonyOS应用,不妨尝试一下这个网络通信模块封装,让你的开发过程更加顺畅。希望本文对你有所帮助,欢迎交流与分享经验!
写在最后
最后,推荐下笔者的业余开源app影视项目“爱影家”,推荐分享给与我一样喜欢观影的朋友。
开源地址:爱影家app开源项目介绍及源码
https://gitee.com/yyz116/imovie
其他资源
luch-request
yyz116/h_request
OpenAtom OpenHarmony
相关文章:
HarmonyOS NEXT应用开发(一、打造最好用的网络通信模块组件)
随着HarmonyOS NEXT 的发布,越来越多的开发者开始关注如何在这个新平台上高效地进行应用开发。其中网络通信模块的封装尤为关键。纵观HarmonyOS的众多三方网络库及封装,竟没有一个简单好用的。虽然有个axios的鸿蒙版,但有点儿重了也不是很好用…...

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT
Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT JetBrains2024(IntelliJ IDEA、PhpStorm、RubyMine、Rider……)安装包Anaconda Miniconda安装.condarc 文件配置镜像源查看conda的配置和源(channel)自定义conda虚拟环境路径conda常用命…...
如何选择合适的BI工具及集成
目录 1 BI工具介绍 1.1 BI工具介绍 1.2 大数据平台与BI工具的集成 2 选择BI工具的考虑因素 2.1 可视化与分析能力 2.2 易用性与学习曲线 2.3 数据源与连接性 2.4 定制化与扩展性 3 案例分析 3.1 案例一:某零售行业的应用 3.2 案例二:某金融企业的应用 3.3 案例三:…...

STM32的串行外设接口SPI
一、SPI简介 1.SPI总线特点 (1)四条通信线 SPI需要SCK、MISO、MOSI、NSS四条通信线来完成数据传输 ,每增加一个从机,多一条NSS通信线。 (2)多主多从 SPI总线允许有多个主机和多个从机。 (3&…...
函数重载
一、概念 C 允许在同一作用域中存在几个功能类似的同名函数,但这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同 int Add(int left, int right) {return leftright; }double Add(double left, double right) {return leftright; }long Add(long left, l…...
单例模式:Python中的“独一无二”模式
引言 单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制资源消耗、管理共享资源或者协调系统组件时非常有用。例如,数据库连接、配置文件管理、日志记录等场景。 基础语法介绍 单例模式的…...

C++和OpenGL实现3D游戏编程【连载12】——游戏中音效的使用
🔥C++和OpenGL实现3D游戏编程【目录】 1、游戏中音效的使用 前面我们实现了图片纹理的显示功能,是不是感觉到非常的简单。那么今天我们就继续说下游戏声音的实现。音效也是游戏的灵魂,只有搭配了美妙动听的音效以后,游戏才能令人耳目一新,与玩家产生良好的效果。 音效文…...

Hive数仓操作(八)
一、Hive中的分桶表 1. 分桶表的概念 分桶表是Hive中一种用于提升查询效率的表类型。分桶指的是根据指定列的哈希值将数据划分到不同的文件(桶)中。 2. 分桶表的原理 哈希分桶:根据分桶列计算哈希值,对哈希值取模,将…...

【C++打怪之路Lv6】-- 内存管理
🌈 个人主页:白子寰 🔥 分类专栏:C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~ 💡 坚持创作博文(平均质量分82)&#…...
408知识点自检(二)
一、细节题 边界对齐长度是由什么决定的?64位计算机边界按几字节对齐?单周期cpu、多周期cpu、基本流水线cpu、超标量cpu的cpi分别是多少?中断的处理优先级和响应优先级分别由谁决定?动态分区管理需要用什么重定位方式?…...

C语言复习概要(二)
本文目录 C语言中的数组与函数详解1. 引言2. 数组2.1. 什么是数组?语法:示例: 2.2. 数组的初始化示例 1:在声明时初始化示例 2:部分初始化示例 3:运行时赋值 2.3. 数组的访问与修改示例: 2.4. 多…...

小程序原生-利用setData()对不同类型的数据进行增删改
1. 声明和绑定数据 wxml文件 <view> {{school}} </view> <view>{{obj.name}}</view> <view id"{{id}}" > 绑定属性值 </view> <checkbox checked"{{isChecked}}"/> <!--算数运算--> <view>{{ id …...

.NET Core 集成 MiniProfiler性能分析工具
前言: 在日常开发中,应用程序的性能是我们需要关注的一个重点问题。当然我们有很多工具来分析程序性能:如:Zipkin等;但这些过于复杂,需要单独搭建。 MiniProfiler就是一款简单,但功能强大的应用…...

【JAVA开源】基于Vue和SpringBoot的旅游管理系统
本文项目编号 T 063 ,文末自助获取源码 \color{red}{T063,文末自助获取源码} T063,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…...
信息学奥赛一本通 1885:【14NOIP提高组】寻找道路 | 洛谷 P2296 [NOIP2014 提高组] 寻找道路
【题目链接】 洛谷 P2296 [NOIP2014 提高组] 寻找道路 ybt 1885:【14NOIP提高组】寻找道路 【题目考点】 1. 图论:广搜 2. 图论:反图 【解题思路】 设path数组,path[i]表示顶点i出发到终点t是否有路径。 先求path数组&#…...

JVM 基础、GC 算法与 JProfiler 监控工具详解
目录 1、引言 1.1 JVM内存与本地内存 1.2 JVM与JDK的关系 2、JVM基础 2.1 JVM(Java Virtual Machine) 2.2 Java与JVM的关系 2.3 JVM的内存结构 2.3.1 堆内存 2.3.2 栈内存 2.3.3 方法区 2.3.4 本地方法栈 2.3.5 程序计数器(PC寄存…...

nodejs安装及环境配置
一、下载 进入官网https://nodejs.org/en/download/prebuilt-installer下载node.js安装包,选择对应版本的node,这里我选择的是14.21.3版本 二、安装 1、下载完成后,双击“node-v14.21.3-x64.msi”,开始安装Node.js 2、勾选复…...

无人机电力巡检:点亮电力巡检新视野!
一、无人机电力巡查的优势 提高巡检效率:无人机可以搭载高清摄像头、红外热像仪等先进设备,实时拍摄和传输图像,帮助巡检人员快速发现潜在问题,如电线破损、绝缘子污损、设备过热等,从而大大缩短了巡检周期。 降低人…...

详细介绍:API 和 SPI 的区别
文章目录 Java SPI (Service Provider Interface) 和 API (Application Programming Interface) 的区别详解目录1. 定义和目的1.1 API (Application Programming Interface)1.2 SPI (Service Provider Interface) 2. 使用场景2.1 API 的应用场景2.2 SPI 的应用场景 3. 加载和调…...

【面向对象】设计模式概念和分类
零.前提提要 本文章是我考中级软件设计师时的笔记,基本都是一些自己的思路和见解,现记录一下,希望可以帮助到即将考证的同学。 一.面向对象设计模式的概念 二.面向对象的设计模式分类 设计模式确定了所包含的类和实例、他们的角色和写作方式以…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...