建设英文品牌网站,网站后台如何登陆,网站开发公司怎么建服务器,wordpress 农历小工具HarmonyOS —— 发送网络请求#xff08;ArkTS#xff09;实战笔记#xff08;RemoteCommunicationKit rcp#xff09;
鸿蒙开发者第四期活动
这篇是我啃官方文档《发送网络请求#xff08;ArkTS#xff09;》时整理的学习笔记#xff0c;主要是帮自己理顺三件事…HarmonyOS —— 发送网络请求ArkTS实战笔记RemoteCommunicationKit rcp鸿蒙开发者第四期活动这篇是我啃官方文档《发送网络请求ArkTS》时整理的学习笔记主要是帮自己理顺三件事HarmonyOS 里网络请求到底是怎么发的不是浏览器那个fetch…rcp.createSession()session.get/post/put/...这一套到底怎么用遇到要提交表单、多部分上传Form / MultipartForm的时候ArkTS 这边怎么写才好维护下面就是我按自己的理解整理的一套“实战向”梳理方便以后写博客 / 复习 / 踩坑查漏。一句话先记住一句话记在 HarmonyOS 里要发 HTTP 请求不是随手来个fetch(url)就完事而是 通过RemoteCommunicationKit 的rcp模块创建一个session 然后用session.fetch / get / post / put / head / delete来发各种请求 复杂数据用Form/MultipartForm填到Request.content里。1. 能在哪些设备上用约束先过一眼官方给的能力覆盖范围是支持设备Phone、2in1、Tablet、Wearable从5.1.1(19)开始新增支持TV 设备简单理解只要是主流 HarmonyOS 设备基本都能用这套网络请求能力电视也从 5.1.1 之后跟上了。2. RemoteCommunicationKit 基础rcp Session2.1 导入模块所有网络请求的入口都在kit.RemoteCommunicationKit的rcp命名空间里import { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit;BusinessError用来兜底各种错误码和异常信息。2.2 Session所有请求的“会话对象”核心概念只有一个先创建会话再用会话发请求。const session rcp.createSession();之后session.fetch(...)session.get(...)session.post(...)session.put(...)session.head(...)session.delete(...)全都挂在这个session上。我自己的习惯是一段逻辑里用完会话就session.close()一下防止长时间占用资源特别是频繁发请求的时候。3. 通用的 fetch自己构造 Requestfetch比较底层、也最灵活你自己构造一个Request对象想怎么配 header、body、URL 都行然后丢给会话去发。3.1 基本流程构造rcp.Request(url, method)rcp.createSession()session.fetch(request)拿到PromiseResponse3.2 示例最简单的 fetch GETimport { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit; // 1. 构造请求 const kHttpServerAddress https://www.example.com/fetch; const request new rcp.Request(kHttpServerAddress, GET); // 2. 创建会话 const session rcp.createSession(); // 3. 发请求 session.fetch(request) .then((rep: rcp.Response) { console.info(Response succeeded: ${rep}); }) .catch((err: BusinessError) { console.error( Response err: Code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err)} ); });实际项目里Request还能设置请求头request.headers {...}请求体request.content ...配合Form/MultipartForm/ 自定义内容fetch更像是“通用版本”后面那堆get/post/put/...算是常用 HTTP 方法的快捷封装。4. GET最常用的读取数据方式4.1 接口说明get(url: URLOrString, destination?: ResponseBodyDestination): PromiseResponseurl要请求的地址destination响应体目标可选比如流式处理或者指定存储方式返回PromiseResponse4.2 示例发一个 GET 请求import { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit; // 1. 请求地址示例实际按自己的接口来 const getURL http://www.example.com/get; // 2. 创建会话 const session rcp.createSession(); // 3. 发 GET 请求 session.get(getURL) .then((response: rcp.Response) { console.info(Response succeeded: ${response}); // 这里可以继续处理 response.body / response.headers / response.statusCode }) .catch((err: BusinessError) { console.error( Response err: Code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err)} ); });特点GET 默认把参数拼在 URL 上比如?id1namexxx适合查数据、拉配置、获取列表 / 详情等。5. POST提交数据的主力请求5.1 接口说明post( url: URLOrString, content?: RequestContent, destination?: ResponseBodyDestination ): PromiseResponsecontent要发给服务器的数据表单 / JSON / file 等都可以封进RequestContentdestination响应体处理方式可选5.2 示例用 fields 提交简单表单数据import { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit; // URL 示例 const postURL https://www.example.com; // 构造要提交的内容 const postContent: rcp.RequestContent { fields: { key1: value1, key2: value2, key3: value3 } }; // 创建会话 const session rcp.createSession(); // 发 POST 请求 session.post(postURL, postContent) .then((response: rcp.Response) { console.info(Response headers: ${JSON.stringify(response.headers)}); console.info(Response status: ${JSON.stringify(response.statusCode)}); console.info(Request content: ${JSON.stringify(postContent)}); }) .catch((err: BusinessError) { console.error( Response err: Code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err)} ); });常见场景创建资源新增提交表单登录、注册、下单等向后端发送 JSON 数据、表单数据6. PUT更新资源的幂等请求PUT 的语义更新指定资源通常是全量更新幂等—— 连续调用多次结果应该是一样的。6.1 接口说明put( url: URLOrString, content?: RequestContent, destination?: ResponseBodyDestination ): PromiseResponse6.2 示例用 PUT 更新资源import { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit; // 1. 创建会话 const session rcp.createSession(); // 2. 要提交的内容写法和 POST 类似 const putContent: rcp.RequestContent { fields: { key1: value1, key2: value2, key3: value3 } }; // 3. 发 PUT 请求 session.put(http://www.example.com/put, putContent) .then((response: rcp.Response) { console.info(Response succeeded: ${response}); }) .catch((err: BusinessError) { console.error( Response err: Code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err)} ); });我自己的使用习惯新增用 POST整体更新用 PUT局部更新比如只改一个字段如果接口支持会用 PATCH如果后面有对应封装的话7. HEAD只要响应头不要内容HEAD 很适合这种场景想知道文件多大、最后更新时间等元信息想检查资源是否存在 / 是否有权限想探测接口状态但是不想拉整个响应体。7.1 接口说明head(url: URLOrString): PromiseResponse7.2 示例发一个 HEAD 请求import { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit; // 1. 创建会话 const session rcp.createSession(); // 2. 发 HEAD 请求 session.head(http://www.example.com/head) .then((response: rcp.Response) { console.info(Response succeeded: ${response}); // 关注 response.headers 就够了 }) .catch((err: BusinessError) { console.error( Response err: Code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err)} ); });8. DELETE删除远端资源DELETE 语义删除指定 URL 对应的资源。8.1 接口说明delete(url: URLOrString): PromiseResponse8.2 示例DELETE 请求import { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit; // 1. 创建会话 const session rcp.createSession(); // 2. 发 DELETE 请求 session.delete(http://www.example.com/delete) .then((response: rcp.Response) { console.info(Response succeeded: ${response}); }) .catch((err: BusinessError) { console.error( Response err: Code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err)} ); });常见用在删除某个记录取消某个预约/订阅清理服务端的一些临时资源9. Form发送简单表单数据RequestContent当我们在 HTTP 请求中要发表单数据时可以用Form来生成一个RequestContent直接丢给 Request。9.1 版本点从6.0.1(21)开始Form支持keys属性可以用来控制表单中 Key 的发送顺序。9.2 示例使用 Form 发送简单表单import { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit; // 1. 创建 Form 表单数据 const simpleForm new rcp.Form({ key1: value1, key2: value2, }); // 2. 指定发送顺序 // - 指定后按 [key2, key1] 的顺序发送 // - 不在列表中的 key 不会被发送 simpleForm.keys [key2, key1]; // 3. 创建 Request let req new rcp.Request(http://example.com); req.content simpleForm; // 4. 创建会话 发 fetch 请求 try { const session rcp.createSession(); session.fetch(req) .then((resp: rcp.Response) { console.info(Response succeeded: ${JSON.stringify(resp)}); session.close(); }) .catch((err: BusinessError) { console.error( Response err: Code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err)} ); session.close(); }); } catch (err: any) { console.error( createSession err: Code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err)} ); }这里有一个小细节如果指定了keys只会发送keys里出现的字段并且按照keys的顺序发送。如果不指定keys默认按各个 key 的 hash 顺序发送。这个在一些后端“严格按顺序解析”或者“签名校验里包含顺序”的场景特别有用。10. MultipartForm发送多部分表单文件上传等如果要发的是带文件 / 多部分的数据就要上MultipartForm典型场景就是文件上传。10.1 版本点同样是从6.0.1(21)开始MultipartForm也支持keys来指定发送顺序。10.2 示例使用 MultipartForm 发送多部分数据import { rcp } from kit.RemoteCommunicationKit; import { BusinessError } from kit.BasicServicesKit; // 1. 创建 MultipartForm 数据 const multiForm new rcp.MultipartForm({ key1: value1, key2: value2, key3: value3, // 实际项目里这里可以放文件、二进制内容等 }); // 2. 指定发送顺序 multiForm.keys [key3, key1, key2]; // 3. 创建 Request let req new rcp.Request(http://example.com); req.content multiForm; // 4. 创建会话 发请求 try { const session rcp.createSession(); session.fetch(req) .then((resp: rcp.Response) { console.info(Response succeeded: ${JSON.stringify(resp)}); session.close(); }) .catch((err: BusinessError) { console.error( Response err: Code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err)} ); session.close(); }); } catch (err: any) { console.error( createSession err: Code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err)} ); }可以把它理解成Form纯 key-value 文本表单MultipartForm可以混合文本 文件的多段表单对应multipart/form-data场景11. 我自己的几点实战小结最后用几条“以后写代码要记得注意”的点收个尾所有请求都基于 Session统一入口const session rcp.createSession()用完记得session.close()特别是频繁请求的场景。简单就用 get/post复杂用 fetch RequestGET / POST / PUT / HEAD / DELETE 适合常规接口有特殊 header / 复杂 body / 特殊目的时构造一个Requestsession.fetch()会更自在。错误处理一定要写到 catch 里Promise 风格then(...).catch((err: BusinessError) { ... })err.codeerr.message是排查问题的关键。Form / MultipartForm 的 keys 顺序不要忽略遇到和后端签名、网关校验这些“对顺序敏感”的情况时simpleForm.keys/multiForm.keys非常好用。记得设备约束这套能力支持 Phone / 2in1 / Tablet / WearableTV 要从5.1.1(19)开始才支