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

告别拼接URL!手把手教你封装HarmonyOS的POST请求工具类

告别拼接URL手把手教你封装HarmonyOS的POST请求工具类在HarmonyOS应用开发中网络请求是每个开发者都无法绕开的核心功能。很多从Android转战HarmonyOS的开发者会发现原本在Android中通过Retrofit等框架轻松实现的POST请求在HarmonyOS中却需要手动拼接URL参数这不仅让代码显得冗长丑陋更违背了RESTful API的设计原则。本文将带你从工程化角度出发封装一个优雅、安全的POST请求工具类让你的HarmonyOS代码焕然一新。1. 为什么需要封装POST请求工具类在HarmonyOS的http模块中POST请求的参数传递方式常常让开发者感到困惑。与Android不同直接将参数放入extraData并不能被服务端正确接收这导致很多开发者不得不采用GET请求的方式将参数拼接到URL上。这种做法至少存在三个明显问题安全性隐患URL中的参数会明文暴露在日志和浏览器历史记录中代码可读性差参数拼接使得URL变得冗长难以维护违背RESTful规范POST请求的参数应该放在请求体中而非URL以下是一个典型的问题代码示例requestUserInfo({ url: https://api.example.com/login?usernameadminpassword123456, method: http.RequestMethod.POST, extraData: {} }).then(...)2. 设计POST请求工具类的核心功能一个完善的POST请求工具类应该具备以下核心能力参数自动序列化支持对象参数自动转换为JSON字符串Content-Type自动设置根据参数类型自动配置合适的请求头统一错误处理集中管理网络错误和业务错误请求拦截机制支持添加公共参数或认证信息响应数据解析自动将响应数据反序列化为指定类型我们可以先定义工具类的基本结构class HttpUtil { private static instance: HttpUtil; private baseUrl: string; private headers: Recordstring, string {}; private constructor(baseUrl: string) { this.baseUrl baseUrl; this.initDefaultHeaders(); } public static getInstance(baseUrl: string): HttpUtil { if (!HttpUtil.instance) { HttpUtil.instance new HttpUtil(baseUrl); } return HttpUtil.instance; } private initDefaultHeaders(): void { this.headers { Content-Type: application/json;charsetutf-8 }; } // 其他方法将在后续实现 }3. 实现核心POST请求方法现在我们来实现最关键的post方法该方法需要处理参数序列化、请求头设置和错误处理public async postT(endpoint: string, params?: object): PromiseT { try { const url ${this.baseUrl}${endpoint}; const response await requestT({ url: url, method: http.RequestMethod.POST, header: this.headers, extraData: params ? JSON.stringify(params) : undefined }); return this.handleResponseT(response); } catch (error) { return this.handleError(error); } } private handleResponseT(response: any): T { if (response.code ! 200) { throw new Error(response.message || 请求失败); } return response.data as T; } private handleError(error: any): never { console.error(请求失败: ${JSON.stringify(error)}); throw new Error(error.message || 网络请求异常); }使用这个工具类之前的登录请求可以简化为const http HttpUtil.getInstance(https://api.example.com); http.postUserInfo(/login, { username: admin, password: 123456 }).then(userInfo { console.info(登录成功: ${JSON.stringify(userInfo)}); }).catch(error { console.error(登录失败: ${error.message}); });4. 高级功能扩展基础功能实现后我们可以进一步扩展工具类的实用性4.1 添加请求拦截器private interceptors: Array(config: RequestConfig) RequestConfig []; public addInterceptor(interceptor: (config: RequestConfig) RequestConfig): void { this.interceptors.push(interceptor); } private applyInterceptors(config: RequestConfig): RequestConfig { return this.interceptors.reduce((cfg, interceptor) interceptor(cfg), config); }4.2 支持多种Content-Typepublic setContentType(type: json | form): void { this.headers[Content-Type] type json ? application/json;charsetutf-8 : application/x-www-form-urlencoded; } private serializeParams(params: object, contentType: string): string { if (contentType.includes(x-www-form-urlencoded)) { return Object.entries(params) .map(([key, value]) ${encodeURIComponent(key)}${encodeURIComponent(value)}) .join(); } return JSON.stringify(params); }4.3 添加超时设置public setTimeout(timeout: number): void { this.timeout timeout; } private getRequestConfig(endpoint: string, method: http.RequestMethod, data?: any): RequestConfig { return { url: ${this.baseUrl}${endpoint}, method: method, header: this.headers, extraData: data, connectTimeout: this.timeout, readTimeout: this.timeout }; }5. 完整工具类实现将上述功能整合我们得到完整的HttpUtil工具类import http from ohos.net.http; import { RequestConfig, ResponseError } from ohos.net.http; type HttpMethod GET | POST | PUT | DELETE; class HttpUtil { private static instance: HttpUtil; private baseUrl: string; private headers: Recordstring, string {}; private interceptors: Array(config: RequestConfig) RequestConfig []; private timeout: number 60000; private constructor(baseUrl: string) { this.baseUrl baseUrl.endsWith(/) ? baseUrl.slice(0, -1) : baseUrl; this.initDefaultHeaders(); } public static getInstance(baseUrl: string): HttpUtil { if (!HttpUtil.instance) { HttpUtil.instance new HttpUtil(baseUrl); } return HttpUtil.instance; } private initDefaultHeaders(): void { this.headers { Content-Type: application/json;charsetutf-8, Accept: application/json }; } public async requestT( method: HttpMethod, endpoint: string, params?: object ): PromiseT { try { const serializedData this.serializeParams(params || {}, this.headers[Content-Type]); const config this.applyInterceptors({ url: ${this.baseUrl}${endpoint}, method: this.mapMethod(method), header: this.headers, extraData: serializedData, connectTimeout: this.timeout, readTimeout: this.timeout }); const response await requestT(config); return this.handleResponseT(response); } catch (error) { return this.handleError(error); } } public async postT(endpoint: string, params?: object): PromiseT { return this.requestT(POST, endpoint, params); } // 其他HTTP方法实现类似此处省略... private mapMethod(method: HttpMethod): http.RequestMethod { const map: RecordHttpMethod, http.RequestMethod { GET: http.RequestMethod.GET, POST: http.RequestMethod.POST, PUT: http.RequestMethod.PUT, DELETE: http.RequestMethod.DELETE }; return map[method]; } private serializeParams(params: object, contentType: string): string { if (!params) return ; if (contentType.includes(x-www-form-urlencoded)) { return Object.entries(params) .map(([key, value]) ${encodeURIComponent(key)}${encodeURIComponent(value)}) .join(); } return JSON.stringify(params); } private handleResponseT(response: any): T { if (response.code ! 200) { throw new Error(response.message || 请求失败); } return response.data as T; } private handleError(error: ResponseError): never { console.error(请求失败: ${JSON.stringify(error)}); throw new Error(error.message || 网络请求异常); } public addInterceptor(interceptor: (config: RequestConfig) RequestConfig): void { this.interceptors.push(interceptor); } private applyInterceptors(config: RequestConfig): RequestConfig { return this.interceptors.reduce((cfg, interceptor) interceptor(cfg), config); } public setContentType(type: json | form): void { this.headers[Content-Type] type json ? application/json;charsetutf-8 : application/x-www-form-urlencoded; } public setTimeout(timeout: number): void { this.timeout timeout; } public setHeader(key: string, value: string): void { this.headers[key] value; } } export default HttpUtil;6. 实际应用示例让我们看几个实际使用这个工具类的例子6.1 用户登录场景// 初始化HTTP工具 const http HttpUtil.getInstance(https://api.example.com); // 添加全局拦截器用于添加认证token http.addInterceptor(config { const token PreferencesManager.getInstance().getSync(auth_token); if (token) { config.header config.header || {}; config.header[Authorization] Bearer ${token}; } return config; }); // 登录请求 async function login(username: string, password: string): PromiseUserInfo { try { const user await http.postUserInfo(/auth/login, { username, password }); // 保存token PreferencesManager.getInstance().putSync(auth_token, user.token); return user; } catch (error) { console.error(登录失败:, error.message); throw error; } }6.2 文件上传场景async function uploadFile(fileUri: string): PromiseUploadResult { // 切换为表单格式 http.setContentType(form); const formData new FormData(); formData.append(file, { uri: fileUri, type: image/jpeg, name: photo.jpg }); const result await http.postUploadResult(/files/upload, formData); // 恢复默认JSON格式 http.setContentType(json); return result; }6.3 带参数的分页查询async function fetchArticles(page: number, size: number): PromiseArticle[] { return http.getArticle[](/articles, { page, size, sort: createdAt,desc }); }封装这样一个完善的POST请求工具类后你会发现HarmonyOS的网络请求代码变得简洁、统一且易于维护。更重要的是它遵循了RESTful API的最佳实践参数不再暴露在URL中安全性得到了显著提升。

相关文章:

告别拼接URL!手把手教你封装HarmonyOS的POST请求工具类

告别拼接URL!手把手教你封装HarmonyOS的POST请求工具类 在HarmonyOS应用开发中,网络请求是每个开发者都无法绕开的核心功能。很多从Android转战HarmonyOS的开发者会发现,原本在Android中通过Retrofit等框架轻松实现的POST请求,在H…...

【技术拆解】DCVC-RT:如何用五大创新让神经视频编码跑进实时时代?

1. 神经视频编码的实时化挑战 视频压缩技术发展到今天,已经进入了一个关键的转折点。传统视频编码标准如H.264、H.265已经接近理论极限,而基于神经网络的视频压缩方法虽然展现出更好的压缩效率,却一直受限于计算速度。这就好比一个天才厨师&a…...

Z-Image-Turbo-辉夜巫女保姆级教程:从部署到出图,小白也能轻松玩转

Z-Image-Turbo-辉夜巫女保姆级教程:从部署到出图,小白也能轻松玩转 1. 前言:为什么选择Z-Image-Turbo-辉夜巫女 如果你正在寻找一个简单易用、效果惊艳的AI图像生成工具,Z-Image-Turbo-辉夜巫女绝对值得尝试。这个基于阿里巴巴通…...

技术解析:ncmdump如何破解网易云音乐NCM格式加密机制

技术解析:ncmdump如何破解网易云音乐NCM格式加密机制 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字音乐版权保护日益严格的今天,网易云音乐采用NCM格式对下载的音乐文件进行加密保护,这种…...

一台电脑畅玩多人游戏:Nucleus Co-Op分屏神器完全指南

一台电脑畅玩多人游戏:Nucleus Co-Op分屏神器完全指南 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 还在为和朋友一起玩游戏需要多台…...

open-source-jobs未来发展规划:开源工作平台的愿景与路线图

open-source-jobs未来发展规划:开源工作平台的愿景与路线图 【免费下载链接】open-source-jobs A list of Open Source projects offering jobs. 项目地址: https://gitcode.com/gh_mirrors/op/open-source-jobs open-source-jobs 是一个专注于连接开源项目与…...

自动化规划工具提升工单分配效率

自动化规划工具使工单分配更高效 “分支定界”方法可排除混合整数非线性规划问题中的非最优解。 作者:Anupam Purwar 2023年3月28日 阅读时长:4分钟自动化规划工具是结合人工智能与设计算法的程序,用于规划与调度任务、资源和活动。它们广泛应…...

LumiPixel Canvas Quest创意工坊:利用GAN实现风格化人像迁移

LumiPixel Canvas Quest创意工坊:利用GAN实现风格化人像迁移 1. 当AI画笔遇见艺术创作 想象一下,你随手拍的一张普通自拍,经过AI处理后变成了赛博朋克风格的未来战士肖像,或是水墨画中的古典人物。这正是LumiPixel Canvas Quest…...

为什么Scarab模组管理器能让空洞骑士的模组安装变得如此简单?

为什么Scarab模组管理器能让空洞骑士的模组安装变得如此简单? 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为《空洞骑士》模组安装的复杂流程而头疼吗&…...

基于Simulink的无刷电机调速系统仿真

目 录 第一章 绪论 1 1.1 研究背景及研究意义 1 1.2 无刷直流电机调速系统的国内外研究现状 2 1.3 本文的主要研究内容及章节安排 3 第二章 无刷直流电机的基本原理 4 2.1 无刷直流电机的基本结构 4 2.1.1 电机本体 4 1.电动机定子 4 2. 电动机转子 5 2.1.2 位置传感器 5 2.…...

XUnity.AutoTranslator:如何为Unity游戏构建智能翻译解决方案?

XUnity.AutoTranslator:如何为Unity游戏构建智能翻译解决方案? 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 在全球化游戏市场中,语言障碍成为玩家体验的最大障碍之一…...

PyTorch 2.9镜像入门:无需配置,直接开启GPU加速

PyTorch 2.9镜像入门:无需配置,直接开启GPU加速 1. 为什么选择PyTorch 2.9镜像 深度学习开发环境配置一直是让新手头疼的问题,特别是GPU驱动的安装和CUDA环境的配置。PyTorch 2.9镜像解决了这个痛点,它预装了完整的PyTorch 2.9环…...

音频处理必看:短时傅里叶变换(STFT)在语音识别中的5个典型应用场景

音频处理必看:短时傅里叶变换(STFT)在语音识别中的5个典型应用场景 语音识别技术正以前所未有的速度渗透到智能家居、车载系统、客服机器人等日常场景中。作为这项技术的核心算法之一,短时傅里叶变换(STFT)就像一位隐形的音频解码…...

Mac Mouse Fix:让普通鼠标释放专业级生产力

Mac Mouse Fix:让普通鼠标释放专业级生产力 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 还在忍受MacOS下鼠标滚动卡顿、侧键功能…...

用Minimalmodbus玩转PLC通信:从环境配置到寄存器读写的完整流程

MinimalModbus实战指南:高效连接西门子PLC的Python自动化方案 工业自动化领域的数据采集常面临设备资源有限、协议兼容性复杂等挑战。作为一款专为嵌入式系统优化的轻量级库,MinimalModbus以其简洁的API和极低的内存占用,成为连接西门子S7系列…...

BaiduPCS-Web:智能突破百度网盘限速的革命性解决方案

BaiduPCS-Web:智能突破百度网盘限速的革命性解决方案 【免费下载链接】baidupcs-web 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcs-web 还在为百度网盘的下载速度而烦恼吗?当急需下载重要文件时,几十KB/s的速度是否让你感到…...

5分钟搞定USR-K5模块配置:串口转以太网通讯的保姆级教程

5分钟搞定USR-K5模块配置:串口转以太网通讯的保姆级教程 当你需要在嵌入式系统中快速实现串口设备与以太网的互联时,USR-K5模块是个不错的选择。这款小巧的串口转以太网模块,能够帮助开发者省去复杂的网络协议栈开发工作,特别适合…...

Go JSON 编解码性能优化技巧

Go语言因其高效的并发模型和简洁的语法广受开发者喜爱,但在处理JSON编解码时,性能问题常成为瓶颈。随着微服务和高并发场景的普及,优化JSON处理效率变得尤为重要。本文将分享几个实用的Go JSON编解码性能优化技巧,帮助开发者提升应…...

REFramework:游戏增强引擎与开源工具集的革新实践

REFramework:游戏增强引擎与开源工具集的革新实践 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework 价值定位:重新定义RE引…...

[游戏辅助工具] HunterPie:怪物猎人世界数据可视化解决方案 - 面向狩猎效率追求者

[游戏辅助工具] HunterPie:怪物猎人世界数据可视化解决方案 - 面向狩猎效率追求者 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/…...

从无线通信到国防测试:基于6U VPX国产载板的快速原型开发实战

6U VPX国产载板在高性能实时处理系统中的实战应用 在无线通信、国防电子和测试测量等对实时性要求极高的领域,系统架构师们常常面临一个核心挑战:如何快速搭建一个既能处理复杂算法又能满足严苛环境要求的硬件验证平台。传统方案往往需要在性能、灵活性和…...

TTS-Vue终极指南:如何快速构建高性能本地语音合成应用

TTS-Vue终极指南:如何快速构建高性能本地语音合成应用 【免费下载链接】tts-vue 🎤 微软语音合成工具,使用 Electron Vue ElementPlus Vite 构建。 项目地址: https://gitcode.com/gh_mirrors/tt/tts-vue 在数据安全和网络稳定性成…...

告别信号焦虑:你的手机是如何通过载波聚合(CA)实现网速翻倍的?

告别信号焦虑:你的手机是如何通过载波聚合(CA)实现网速翻倍的? 站在地铁站台刷短视频突然卡成PPT,商场负一层扫码支付转圈半分钟——这些让人抓狂的场景背后,其实藏着运营商和手机厂商正在悄悄部署的"…...

基于xlsx.core.min.js实现前端表格数据的智能导入与精准导出

1. 为什么选择xlsx.core.min.js处理表格数据 第一次接触前端Excel处理需求时,我试过至少5种方案。有的库体积太大,有的兼容性差,还有的文档晦涩难懂。直到发现xlsx.core.min.js这个宝藏库,才真正解决了我的痛点。这个只有200KB左右…...

3个创新点让游戏优化工具实现高效资源管理

3个创新点让游戏优化工具实现高效资源管理 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源,支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 你是否曾遇到这样的场景:激战正酣时画面突然定格&a…...

【C语言】C语言之数字金字塔进阶实战:从基础到复杂

1. 数字金字塔基础实现 第一次接触数字金字塔时&#xff0c;我被它整齐的排列方式深深吸引。这种通过数字构建的图形不仅美观&#xff0c;更是理解循环结构的绝佳案例。让我们从一个最基础的5层金字塔开始&#xff1a; #include<stdio.h> int main() {int n 5;for(int i…...

革命性Android性能监控平台ArgusAPM:一站式解决移动应用性能难题

革命性Android性能监控平台ArgusAPM&#xff1a;一站式解决移动应用性能难题 【免费下载链接】ArgusAPM Powerful, comprehensive (Android) application performance management platform. 360线上移动性能检测平台 项目地址: https://gitcode.com/gh_mirrors/ar/ArgusAPM …...

Win11Debloat终极指南:一键清理Windows系统,让电脑运行速度提升40%

Win11Debloat终极指南&#xff1a;一键清理Windows系统&#xff0c;让电脑运行速度提升40% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other chan…...

WiFi密码安全测试:如何用hashcat的掩码模式快速爆破简单密码?

WiFi密码安全测试&#xff1a;hashcat掩码模式的高效爆破策略 在网络安全评估中&#xff0c;WiFi密码强度测试是基础但关键的一环。传统字典攻击虽然简单直接&#xff0c;但面对特定密码模式时效率低下。本文将深入探讨如何利用hashcat的掩码模式&#xff08;Mask Attack&#…...

Natron Rotoscoping与跟踪技术:专业影视特效制作终极指南

Natron Rotoscoping与跟踪技术&#xff1a;专业影视特效制作终极指南 【免费下载链接】Natron Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry. 项目地址: https://gitcode.com/gh_…...