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,把createHttpdestroy、错误处理都封装好。这样每个页面调用时,只需要传URL和参数就行,代码干净很多。

嗯,关于@ohos.net.http模块的基础用法,就这些。说白了就是三板斧:创建、设置、请求。但每一板斧都有细节要注意。你多写几次,自然就熟练了。


公众号:蓝海资料掘金营,微信deep3321