尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
HarmonyOS 6.1 网络请求实战:从 createHttp 到数据驱动的完整链路
基于 NetworkDemo 实战验证覆盖 HTTP 请求全流程、错误处理、请求日志附带完整可运行代码写在前面做网络请求这事儿在 HarmonyOS 上比在 Android 上蛋疼不少。Android 有 Retrofit、OkHttp 一堆成熟的库HarmonyOS 就一个kit.NetworkKit的 http 模块用法偏底层没有自动 JSON 解析没有拦截器连请求日志都得自己打。但好消息是底层意味着可控。你知道每一步在干什么出了问题能直接定位。这篇文章就把我用http.createHttp()做网络请求踩过的坑全列出来。一、HTTP 请求五步流程先说清楚完整流程后面再逐个展开import{http}fromkit.NetworkKit// 1. 创建请求对象consthttpRequesthttp.createHttp()// 2. 发起请求httpRequest.request(url,{method:http.RequestMethod.GET,header:{Content-Type:application/json},connectTimeout:10000,readTimeout:10000}).then((response:http.HttpResponse){// 3. 处理成功响应constresult:stringresponse.resultasstringconstdataJSON.parse(result)// ...}).catch((err:Error){// 4. 处理失败console.error(err.message)}).finally((){// 5. 释放资源必须httpRequest.destroy()})看起来不复杂对吧但每一步都有坑。二、踩坑一不 destroy() 就内存泄漏http.createHttp()创建的请求对象是有限资源。如果你不发destroy()这个对象就一直占着内存和连接。连续发几十个请求不 destroy内存直接飙上去。必须在请求结束后调用 destroy()不管是 then 还是 catchhttpRequest.request(url,options).then((response){// 处理响应httpRequest.destroy()// then 里也要 destroy}).catch((err){// 处理错误httpRequest.destroy()// catch 里也要 destroy})更安全的写法是用 finally但 ArkTS 的 Promise 没有 finally……那就 then 和 catch 里都写一遍。麻烦但必须。三、踩坑二缺少 INTERNET 权限 静默失败这个坑坑了我一整个下午。请求发出去then 不进catch 也不进就好像从来没发过请求一样。最后发现是module.json5里忘了声明ohos.permission.INTERNET。关键点缺少权限不会报错不会抛异常就是静默失败。连 hilog 都看不到错误信息。// module.json5 { module: { requestPermissions: [ { name: ohos.permission.INTERNET } ] } }如果你发现网络请求发了没反应第一件事检查权限声明。四、踩坑三response.result 默认是 stringAndroid 的 Retrofit 能自动把 JSON 反序列化成对象HarmonyOS 的 http 模块不行。response.result默认返回 string你得自己JSON.parse.then((response:http.HttpResponse){if(response.responseCode200){constresult:stringresponse.resultasstringconstparsed:ObjectJSON.parse(result)this.postsparsedasPostItem[]}})注意as string这个类型转换。ArkTS strict 模式下不允许随意用as但response.result的类型是string | Object转成 string 是合理的。不过如果服务器返回的不是 JSON 字符串这里会崩。更安全的做法是先判断类型。五、踩坑四并发请求需要多个 http 对象一个httpRequest对象同时只能发一个请求。如果你需要并发比如同时请求列表和详情必须创建多个对象// 错误同一个对象发两个请求第二个会覆盖第一个consthttpRequesthttp.createHttp()httpRequest.request(url1,options1).then(...)httpRequest.request(url2,options2).then(...)// 正确每个请求创建独立对象constreq1http.createHttp()req1.request(url1,options1).then((){req1.destroy()})constreq2http.createHttp()req2.request(url2,options2).then((){req2.destroy()})六、请求配置项详解httpRequest.request(url,{method:http.RequestMethod.GET,// GET/POST/PUT/DELETEheader:{// 请求头Content-Type:application/json,Authorization:Bearer token},extraData:{// POST 请求体string 或 Objectname:test,value:123},connectTimeout:10000,// 连接超时 10秒readTimeout:10000// 读取超时 10秒})extraData 的坑GET 请求不能传 extraData传了会被忽略。POST 请求的 extraData 如果是 Object会自动 JSON.stringify。如果是 string就原样发送。这个行为文档写得不清楚实测出来的。七、请求日志模式线上排查问题请求日志是命根子。Demo 里实现了完整的日志记录privaterequestLogs:RequestLog[][]privateaddLog(url:string,method:string,status:number,duration:number):void{constnow:DatenewDate()consttime:stringnow.getHours().toString().padStart(2,0):now.getMinutes().toString().padStart(2,0):now.getSeconds().toString().padStart(2,0)constlog:RequestLog{url:url,method:method,status:status,duration:duration,time:time}this.requestLogs[log].concat(this.requestLogs)}每次请求记录 URL、方法、状态码、耗时。这个模式建议所有项目都做哪怕只是开发阶段用。耗时计算conststartTime:numberDate.now()httpRequest.request(url,options).then((response){constduration:numberDate.now()-startTimethis.addLog(url,GET,response.responseCode,duration)})注意Date.now()要在request()调用之前获取不是在 then 回调里。then 回调是异步的那时已经开始计算耗时了。八、数据驱动从网络数据到 UI网络请求的最终目的是驱动 UI 更新。基本模式声明 State 数据数组请求成功后赋值ForEach 渲染列表Stateposts:PostItem[][]// 请求成功后this.postsparsedasPostItem[]// UI 渲染ForEach(this.posts,(post:PostItem){Row(){Column(){Text(post.id.toString(). post.title.substring(0,30)).fontSize(12).fontColor(#333333)Text(post.body.substring(0,50)).fontSize(11).fontColor(#888888)}}.onClick((){this.fetchSinglePost(post.id)})},(post:PostItem)post.id.toString())注意 ForEach 的 key用post.id.toString()作为唯一标识不要省略。省略 key 会导致列表更新时全部重渲染性能问题严重。九、错误处理最佳实践网络请求的错误分两类HTTP 错误服务器返回 4xx/5xx在 then 里通过response.responseCode判断网络错误超时、断网、DNS 解析失败在 catch 里处理.then((response:http.HttpResponse){if(response.responseCode200){// 成功}elseif(response.responseCode401){// token 过期跳转登录}else{// 其他 HTTP 错误this.errorMsgHTTP response.responseCode.toString()}}).catch((err:Error){// 网络层错误if(err.message.indexOf(timeout)0){this.errorMsg请求超时请检查网络}else{this.errorMsg网络错误: err.message}})十、网络请求不会阻塞 UI一个常见疑问主线程发网络请求会不会卡 UI不会。httpRequest.request()是异步的底层用 native 线程执行网络 IO不会阻塞 JS 主线程。所以短请求不需要放 TaskPool。但如果请求后要做大量 JSON 解析比如 5000 条记录的列表解析本身可能卡 UI。这种情况应该用 TaskPool 做解析参考第 09 篇 TaskPool 的内容。写在最后HarmonyOS 的网络模块虽然不如 Retrofit 好用但胜在透明。每一行代码你都知道在干什么出了问题能直接定位。不像 Retrofit 好多魔法的背后行为出错的时候一脸懵。建议所有网络请求都封装一层至少把 destroy()、错误处理、日志记录统一起来。裸写http.createHttp()在大项目里维护成本太高。
RELATED

相关推荐

终极macOS菜单栏清理指南:用Ice一键打造清爽高效工作空间

终极macOS菜单栏清理指南:用Ice一键打造清爽高效工作空间

终极macOS菜单栏清理指南:用Ice一键打造清爽高效工作空间 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 你是否厌倦了macOS菜单栏上密密麻麻的图标?Wi-Fi、蓝牙、电池、时间…

📅 2026/9/22 5:13:42
Java计算机毕设之基于前后端分离的新闻稿件审核发布系统的设计与实现 基于 SpringBoot+Vue 的新闻发布会流程管理系统(完整前后端代码+说明文档+LW,调试定制等)

Java计算机毕设之基于前后端分离的新闻稿件审核发布系统的设计与实现 基于 SpringBoot+Vue 的新闻发布会流程管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

📅 2026/9/14 16:48:10
如何快速掌握暗黑破坏神2存档编辑器:新手也能上手的完整指南

如何快速掌握暗黑破坏神2存档编辑器:新手也能上手的完整指南

如何快速掌握暗黑破坏神2存档编辑器:新手也能上手的完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾经因为暗黑破坏神2存档损坏而痛失心爱的角色?是否想测试不同的技能搭配却不想重新练级…

📅 2026/9/14 11:00:19
MORE NEWS

更多资讯

📰

新蒲哪里可以考电工证真实经历告诉你怎么选培训机构

新蒲哪里可以考电工证真实经历告诉你怎么选培训机构 工地太忙根本没时间复习考试,这是很多一线电工的共同心声。尤其是像我这样在鹤壁水利工程一线工作的电工,每天忙得连饭都顾不上吃,哪还有时间去准备考试?但别小看这个电工证,它不仅是你从事特种作业的…

📰

蔡家坡电工证培训机构在哪考?工地太忙根本没时间复习考试

蔡家坡电工证培训机构在哪考?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这几乎是每个在建项目上的电工都遇到过的问题。尤其是对于郑州的在职建筑工人来说,每天十几个小时的作业时间,几乎挤占了所有空闲。再加上电工作业涉及的科目多、知识…

📰

工地太忙根本没时间复习考试,电工证复审需要原件吗真实经历揭秘

工地太忙根本没时间复习考试,电工证复审需要原件吗真实经历揭秘 工地太忙根本没时间复习考试,这是很多电工朋友的真实写照。尤其是像周口这样的施工大市,项目赶进度、人员轮换频繁,电工证复审这事常常被忽视。今天我就从 电工证复审需要原件吗…

📰

怎样省高级电工证多少钱 三步解决复审延期难题

怎样省高级电工证多少钱 三步解决复审延期难题 证书过期了不知道怎么复审延期?别慌,这是很多电工从业者都会遇到的痛点。尤其是高级电工证,不仅关系到你的职业发展,还直接影响到项目参与资格和薪资待遇。很多人担心, 多少钱…

📰

盐城特种工培训到期换证流程:良心建议帮你避坑

盐城特种工培训到期换证流程:良心建议帮你避坑 证书过期了不知道怎么复审延期?很多工人朋友都遇到过这种情况,尤其是在盐城特种工培训体系下,特种作业操作证的复审流程并不简单,稍有疏忽就可能影响到自己的工作和安全。今天就来给大家讲讲,盐城特种工培…

📰

焊接类电工证怎么考?内部消息教你避坑不花冤枉钱

焊接类电工证怎么考?内部消息教你避坑不花冤枉钱 怕考不过白交培训费?现在就给你透露内部消息,焊接类电工证怎么考、怎么避坑,一步到位,省心又省钱! ### 焊接类电工证能干啥?别被忽悠了!…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬