第4章 GET请求实战:使用@ohos.net.http发送GET请求、处理响应数据、错误处理
好,咱们直接进入正题。上一章我们把网络权限和HTTP模块的导入搞定了,这一章就来点实际的——用代码发一个真正的GET请求。
说实话,我刚开始学鸿蒙网络编程的时候,觉得这玩意儿挺唬人的。但用顺手了你会发现,其实就那么几个步骤:创建HTTP对象、设置请求参数、发起请求、处理返回数据。嗯,咱们一个一个来拆解。
4.1 创建HTTP请求对象
在鸿蒙里,所有的网络请求都通过 @ohos.net.http 模块来完成。第一步,你得先创建一个HTTP请求对象。
import http from '@ohos.net.http';
// 创建一个HTTP请求对象
let httpRequest = http.createHttp();
这段代码看着简单,但我得提醒你一句:createHttp() 每次调用都会创建一个新的请求对象。如果你在循环里频繁调用,记得及时销毁,不然内存会蹭蹭往上涨。我在项目里就踩过这个坑,一次批量请求把内存干到了200多MB……
4.2 配置请求参数
对象创建好了,接下来要告诉它:你要访问哪个地址?用什么方式?要不要带请求头?
let url = 'https://api.example.com/users';
let requestOptions = {
method: http.RequestMethod.GET, // 指定GET方法
header: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_token_here'
},
connectTimeout: 60000, // 连接超时,单位毫秒
readTimeout: 60000 // 读取超时
};
这里有个细节:method 字段如果不写,默认就是GET。但为了代码可读性,我建议你还是显式写出来。你想想看,三个月后回来看代码,一眼就能知道这是个GET请求,多省事。
4.3 发起请求并处理响应
配置好了,就该真正发请求了。鸿蒙的HTTP请求是异步的,用Promise或者回调都行。我个人更推荐Promise,代码更清爽。
httpRequest.request(url, requestOptions)
.then((data) => {
// 请求成功,处理返回数据
console.info('请求成功,状态码:' + data.responseCode);
console.info('返回数据:' + data.result);
})
.catch((err) => {
// 请求失败,处理错误
console.error('请求失败:' + JSON.stringify(err));
});
看到 data.responseCode 了吗?这就是HTTP状态码。200表示成功,404表示没找到资源,500表示服务器挂了。我建议你拿到状态码后先判断一下,别一股脑把数据往UI上塞。
data.result 里,通常是JSON字符串。你需要用 JSON.parse() 把它转成对象才能用。
4.4 完整的GET请求示例
把上面几段拼起来,就是一个完整的GET请求了。我给你写个完整的例子,你直接复制就能跑。
import http from '@ohos.net.http';
function fetchUserData(userId: string) {
let httpRequest = http.createHttp();
let url = `https://api.example.com/users/${userId}`;
httpRequest.request(url, {
method: http.RequestMethod.GET,
header: {
'Content-Type': 'application/json'
},
connectTimeout: 60000,
readTimeout: 60000
}).then((data) => {
if (data.responseCode === 200) {
let userInfo = JSON.parse(data.result);
console.info('用户姓名:' + userInfo.name);
// 这里可以更新UI
} else {
console.error('服务器返回异常,状态码:' + data.responseCode);
}
}).catch((err) => {
console.error('网络请求失败:' + err.message);
}).finally(() => {
// 记得销毁请求对象,释放资源
httpRequest.destroy();
});
}
httpRequest.destroy()!我曾经在一个页面里连续发了10个请求,一个都没销毁,结果页面退出后内存一直没释放。用户反馈说手机越来越卡,查了半天才发现是这个问题。
4.5 错误处理——别让用户看到白屏
网络请求嘛,总有失败的时候。用户手机没网、服务器宕机、DNS解析失败……这些情况你都得考虑到。
常见的错误类型有这么几种:
| 错误类型 | 可能原因 | 处理建议 |
|---|---|---|
| 超时 | 网络慢或服务器无响应 | 提示用户检查网络,稍后重试 |
| DNS解析失败 | 域名不存在或网络配置问题 | 检查URL是否正确 |
| 连接被拒绝 | 服务器端口未开放或防火墙拦截 | 联系后端确认服务状态 |
| HTTP 4xx/5xx | 客户端或服务器错误 | 根据状态码给出具体提示 |
我的做法是:在 catch 里统一处理网络层面的错误,在 then 里根据状态码处理业务层面的错误。这样分工明确,代码也干净。
.catch((err) => {
// 网络层面的错误
if (err.code === 28) { // 超时
showToast('网络超时,请检查网络连接');
} else if (err.code === 6) { // DNS解析失败
showToast('无法解析服务器地址');
} else {
showToast('网络异常,请稍后重试');
}
})
catch 里直接弹了个「网络错误」的提示,结果用户反馈说「我明明有网,为什么说网络错误?」后来才发现是服务器返回了500,但我在 then 里没处理,直接走了 catch。所以记住:catch 只处理网络层面的异常,业务错误要在 then 里根据状态码处理。
4.6 知识体系总览
说了这么多,咱们用一张图把整个GET请求的流程串起来。你照着这个图写代码,思路会清晰很多。
这张图把整个流程分成了5步。你写代码的时候,就按这个顺序来,一步都别跳。尤其是最后一步 destroy(),很多人容易忘,但忘了就会出问题。
4.7 实战小技巧
最后分享几个我平时用的小技巧:
- 调试时打印完整请求信息:在
then里把data整个打印出来,看看响应头、状态码、返回数据,能帮你快速定位问题。 - 封装请求函数:别每次都写一遍
createHttp和destroy,封装成一个工具函数,传个URL和回调就行。代码复用率高,也容易维护。 - 加个加载动画:请求发起时显示loading,请求完成或失败时隐藏。用户体验会好很多。
好了,这一章的内容就到这儿。GET请求说白了就是「发请求→等结果→处理数据」这三板斧。你照着上面的代码写一遍,跑通了,就算入门了。