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

HarmonyOS NEXT 封装实现好用的网络模块(基于最新5.0的API12)

在 HarmonyOS-NEXT 开发中,网络请求是应用开发中不可或缺的一部分。为了提高开发效率和代码复用性,我们可以封装一个好用的网络模块组件。本文将介绍如何在 HarmonyOS-NEXT 中封装一个功能强大且易于使用的网络模块组件。

封装目的

网络模块使用的频率最高,也是最核心的一个模块。一个好用的网络模块是加快应用开发的神兵利器。虽然官方提供的@ohos.net.http模块很强大,但是官方提供的直接使用不太好使用。

如何让其能像在类似uniapp中的uni.request那般好用?这里介绍下以下封装实现,可以看到使用变得如此简单。同样的模块封装,之前博主已用在自己开发的影视app中啦。

详见:uni-app 影视类小程序开发从零到一 | 开源项目分享_uniapp 开源项目-CSDN博客

uni-app的网络请求库封装及使用(同时支持微信小程序)_uni.request-CSDN博客

这里效仿之前博主在uniapp中的使用经验,特实现以下模块化封装。 

在封装网络模块组件之前,我们需要明确以下需求:

  1. 支持常见的 HTTP 请求方法:如 GET、POST、PUT、DELETE 等。
  2. 支持自定义请求头:允许开发者设置自定义的请求头。
  3. 支持请求拦截器:在请求发送前和响应返回后执行自定义逻辑。
  4. 支持错误处理:能够捕获并处理网络请求中的错误。
  5. 支持 Promise 和 async/await:方便异步操作。

实现步骤

创建网络模块组件

首先,我们创建一个名为 http.ts 的文件,用于封装网络模块组件。

// utils/http.tsimport http from '@ohos.net.http';class Request {private httpClient: http.HttpRequest;public baseUrl: string;private url: string;//private header: Record<string, string>;public beforeRequest?: (request: Request) => void;public afterRequest?: (response: any) => void;private config:http.HttpRequestOptions;constructor(options: RequestOptions = {}) {this.config = {method: options.method || http.RequestMethod.GET,header: options.header || {},extraData: options.extraData || {}};this.httpClient =  http.createHttp()// 请求的根路径this.baseUrl = options.baseUrl || '';// 请求的 URL 地址this.url = options.url || '';// 请求方式,默认为 GETthis.config.method = options.method || http.RequestMethod.GET;// 请求的参数对象//this.data = options.data || {};// header 请求头//this.header = options.header || {};this.beforeRequest = options.beforeRequest;this.afterRequest = options.afterRequest;this.setupInterceptor()}/*** 配置属性拦截器*/setupInterceptor() {// 这里可以添加拦截器内容}// 添加对 header 的支持private _mergeHeaders(customHeader: Record<string, string> = {}): Record<string, string> {return Object.assign({}, this.config.header, customHeader); // 合并默认 header 和自定义 header}get(url: string, data: Record<string, any> = {}): Promise<any> {this.config.method = http.RequestMethod.GET;this.config.extraData = data;this.url = this.baseUrl + url;return this._();}post(url: string, data: Record<string, any> = {}, header: Record<string, string> = {}): Promise<any> {this.config.method = http.RequestMethod.POST;this.config.extraData = data;this.config.header = this._mergeHeaders(header); // 合并 headerthis.url = this.baseUrl + url;return this._();}put(url: string, data: Record<string, any> = {}): Promise<any> {this.config.method = http.RequestMethod.PUT;this.config.extraData = data;this.url = this.baseUrl + url;return this._();}delete(url: string, data: Record<string, any> = {}): Promise<any> {this.config.method = http.RequestMethod.DELETE;this.config.extraData = data;this.url = this.baseUrl + url;return this._();}private _(): Promise<any> {// 请求之前做一些事if (this.beforeRequest && typeof this.beforeRequest === 'function') {this.beforeRequest(this);}// 发起请求return new Promise((resolve, reject) => {this.httpClient.request(this.url,this.config,(error, data) => {if (!error) {// 请求之后做一些事if (this.afterRequest && typeof this.afterRequest === 'function') {this.afterRequest(data.result);}resolve(data.result);} else {reject(error)}});});}
}// 定义请求选项的类型
interface RequestOptions extends http.HttpRequestOptions {baseUrl?: string;url?: string;beforeRequest?: (request: Request) => void;afterRequest?: (response: any) => void;
}export const $http = new Request();

添加请求拦截器

为了进一步增强网络模块组件的功能,我们可以根据需要修改并添加请求拦截器,在请求发送前和响应返回后执行自定义逻辑。该步骤非必须,根据个人需要。

配置权限

为了在 HarmonyOS 应用中使用网络请求,还需要在 config.json 文件中申请 ohos.permission.INTERNET 权限。

如何使用

有了以上封装,使用就变得很简单啦,举例如下:

import { $http } from '../../utils/http';interface Result{data:string;
}$http.baseUrl = "http://175.178.126.10:8000"@Entry
@Component
struct Index {@State message: string = 'Hello World1';build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Button('test1').width(300).margin({ top: 20 }).onClick(() => {// 需要执行的操作const url ="/api/v1/swiperlist";$http.get(url).then((result: Result)  => {console.log('result:', result);}).catch((error:Error) => {console.error('Error:', error);this.message = 'Request failed!';});})}.width('100%')}.height('100%')}
}

其他资源

文档中心

uni-app的网络请求库封装及使用(同时支持微信小程序)_uni.request-CSDN博客

https://juejin.cn/post/7388470580465434676

Client Initialization | Socket.IO

uni-app的网络请求库封装及使用(同时支持微信小程序)_uni.request-CSDN博客

【鸿蒙HarmonyOS】网络请求http代码实现_鸿蒙axios 获取response header 中的token-CSDN博客

HarmonyOS NEXT开发实战:网络请求库-http_鸿蒙如何封装统一的接口请求配置-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 全志A523 系统篇(一) 获取vmlinux
  • ASP.NET MVC 迅速集成 SignalR
  • 将硬盘的GPT 转化为MBR格式
  • 如何避免在使用 Context API 时出现状态管理的常见问题?
  • Redhat 7,8系(复刻系列) 一键部署Oracle21c-xe rpm
  • 在Android中fragment的生命周期
  • 【多模态融合】【NeurIPS 2021】Attention Bottlenecks for Multimodal Fusion
  • 2025年国家级高新技术企业认定,这些公司过不了了!
  • leetcode 105.从前序与中序遍历序列构造二叉树
  • 创客中国AIGC专题赛冠军天鹜科技:AI蛋白质设计引领者
  • 掌握ChatGPT:高效利用AI助手
  • Spring Boot与gRPC的完美融合:构建高效用户服务与订单服务通信
  • 【网络安全】分享4个高危业务逻辑漏洞
  • 影刀RPE学习——自动化
  • 浅谈C#之AutoResetEvent和ManualResetEvent
  • 分享一款快速APP功能测试工具
  • js递归,无限分级树形折叠菜单
  • Js基础知识(一) - 变量
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • PHP 小技巧
  • Python 基础起步 (十) 什么叫函数?
  • vue总结
  • 笨办法学C 练习34:动态数组
  • 如何学习JavaEE,项目又该如何做?
  • 双管齐下,VMware的容器新战略
  • 一道面试题引发的“血案”
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4.10~4.16)
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (zhuan) 一些RL的文献(及笔记)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (八)c52学习之旅-中断实验
  • (第二周)效能测试
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .Net - 类的介绍
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET NPOI导出Excel详解
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • @ModelAttribute使用详解
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [ C++ ] STL---stack与queue
  • [001-03-007].第07节:Redis中的事务