第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      // 读取超时
};
小提示:我个人习惯把超时时间设成60秒。太短了容易在弱网环境下失败,太长了用户等得着急。60秒是个折中的选择。

这里有个细节: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请求的流程串起来。你照着这个图写代码,思路会清晰很多。

GET请求完整流程 1. 导入http模块 2. createHttp() 3. 配置请求参数 4. request() 发起异步请求 成功:then() 处理响应数据 失败:catch() 错误处理 解析JSON → 更新UI 提示用户 → 记录日志 5. destroy() 释放资源

这张图把整个流程分成了5步。你写代码的时候,就按这个顺序来,一步都别跳。尤其是最后一步 destroy(),很多人容易忘,但忘了就会出问题。

4.7 实战小技巧

最后分享几个我平时用的小技巧:

  • 调试时打印完整请求信息:then 里把 data 整个打印出来,看看响应头、状态码、返回数据,能帮你快速定位问题。
  • 封装请求函数:别每次都写一遍 createHttpdestroy,封装成一个工具函数,传个URL和回调就行。代码复用率高,也容易维护。
  • 加个加载动画:请求发起时显示loading,请求完成或失败时隐藏。用户体验会好很多。

好了,这一章的内容就到这儿。GET请求说白了就是「发请求→等结果→处理数据」这三板斧。你照着上面的代码写一遍,跑通了,就算入门了。


专注资料整理