3. 鸿蒙网络请求API:@ohos.net.http模块
网络编程这块,说白了就是让应用跟服务器「对话」。在鸿蒙系统里,官方给我们准备了一套很趁手的工具——@ohos.net.http模块。我个人觉得,这套API的设计思路挺清晰的,上手也不难。
3.1 @ohos.net.http模块概览
这个模块是鸿蒙系统自带的网络请求库。你不需要额外装任何第三方包,直接导入就能用。我刚开始接触鸿蒙开发时,第一反应是「会不会像Android的HttpURLConnection那样难用?」结果试了一下,发现比我想象中友好得多。
模块的核心就两个东西:
- http.createHttp() —— 创建一个HTTP请求任务
- httpRequest对象 —— 负责发送请求、接收响应
嗯,这里要注意:每次请求都要先创建一个httpRequest实例,用完记得销毁。我在项目中遇到过有人忘了这步,结果内存泄漏了。
核心流程:
创建请求 → 设置参数 → 发起请求 → 处理响应 → 销毁请求
3.2 创建HTTP请求
先看代码,咱们直接上手:
import http from '@ohos.net.http';
// 创建一个HTTP请求任务
let httpRequest = http.createHttp();
就这么简单。不过我要提醒你一句:createHttp()返回的是一个请求任务对象,不是连接池。每次请求最好都新建一个,用完就销毁。我曾经图省事,想复用同一个对象,结果踩了坑——并发请求时数据全乱了。
小技巧:我习惯把请求的创建和销毁写在同一个函数里,这样逻辑清晰,不容易忘。
3.3 设置请求头与参数
请求建好了,接下来就是「打扮」它。你需要告诉服务器:我要用什么方法、带什么参数、穿什么「衣服」(请求头)。
3.3.1 请求方法
常用的就这几种:
| 方法 | 说明 | 我常用的场景 |
|---|---|---|
| GET | 获取数据 | 拉取列表、查询信息 |
| POST | 提交数据 | 登录、注册、上传 |
| PUT | 更新数据 | 修改用户信息 |
| DELETE | 删除数据 | 删除某条记录 |
3.3.2 设置请求头
请求头说白了就是给服务器看的「名片」。比如告诉服务器:我发的是JSON数据,请用UTF-8编码。
let option = {
method: http.RequestMethod.POST,
header: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_token_here',
'Accept-Language': 'zh-CN'
},
extraData: JSON.stringify({
username: 'admin',
password: '123456'
}),
connectTimeout: 60000,
readTimeout: 60000
};
这里有个坑,我踩过好几次:Content-Type一定要跟extraData的格式匹配。你发JSON数据,Content-Type就得是application/json;你发表单数据,就得用application/x-www-form-urlencoded。不匹配的话,服务器会直接返回400错误。
注意:鸿蒙的extraData如果是对象,记得先JSON.stringify()序列化。我曾经直接传了个对象进去,结果服务器收到的是[object Object],排查了半天才发现。
3.3.3 设置超时时间
网络请求最怕什么?卡死。所以超时时间一定要设。我个人习惯:
- connectTimeout:连接超时,设30-60秒
- readTimeout:读取超时,设30-60秒
你想想看,如果用户网络不好,请求卡在那里转圈圈,体验多差。设个超时,至少能给用户一个友好的提示。
3.4 发起请求并处理响应
参数设好了,该「发射」了:
httpRequest.request('https://api.example.com/login', option)
.then((data) => {
// 请求成功
console.info('响应码:' + data.responseCode);
console.info('响应数据:' + data.result);
// 解析JSON
let jsonResult = JSON.parse(data.result);
// 处理你的业务逻辑...
})
.catch((err) => {
// 请求失败
console.error('错误码:' + err.code);
console.error('错误信息:' + err.message);
})
.finally(() => {
// 不管成功失败,最后都要销毁
httpRequest.destroy();
});
注意看finally里的destroy()。这个很重要!我刚开始做鸿蒙开发时,经常忘了这步,结果应用跑久了越来越卡。后来养成了习惯,每次请求都在finally里销毁,再也没出过问题。
避坑指南:我曾经在then里直接返回data.result,以为能链式调用。结果发现data.result是字符串,不是解析好的对象。记住:JSON.parse()这一步不能省。
3.5 完整示例:登录请求
把上面的知识点串起来,写一个完整的登录请求:
import http from '@ohos.net.http';
function login(username, password) {
let httpRequest = http.createHttp();
let option = {
method: http.RequestMethod.POST,
header: {
'Content-Type': 'application/json'
},
extraData: JSON.stringify({
username: username,
password: password
}),
connectTimeout: 30000,
readTimeout: 30000
};
httpRequest.request('https://api.example.com/login', option)
.then((data) => {
if (data.responseCode === 200) {
let result = JSON.parse(data.result);
console.info('登录成功,token:' + result.token);
// 保存token到本地...
} else {
console.error('登录失败,状态码:' + data.responseCode);
}
})
.catch((err) => {
console.error('网络异常:' + err.message);
})
.finally(() => {
httpRequest.destroy();
});
}
这个例子涵盖了创建请求、设置参数、发起请求、处理响应、销毁请求的完整流程。你直接复制过去,改一下接口地址就能用。
个人经验:我建议把网络请求封装成一个工具类。比如写一个HttpUtil,把createHttp、destroy、错误处理都封装好。这样每个页面调用时,只需要传URL和参数就行,代码干净很多。
嗯,关于@ohos.net.http模块的基础用法,就这些。说白了就是三板斧:创建、设置、请求。但每一板斧都有细节要注意。你多写几次,自然就熟练了。
公众号:蓝海资料掘金营,微信deep3321