各位鸿蒙小伙伴!今天咱们搞定 网络通信—— 这可是鸿蒙开发者认证里占 16% 的重点模块,不管是拉接口、传数据还是解析 JSON,做应用根本绕不开!全程保姆级步骤,代码直接复制能用,考点标红记牢!


一、先搞懂核心:HTTP/HTTPS 请求基础(认证高频考)

鸿蒙网络请求主要用 @ohos.net.http 模块,支持 GET/POST/PUT/DELETE 等常用方法,HTTPS 默认支持(不用额外配置证书,超方便!)

步骤 1:配置网络权限(必须先做!)

首先在 module.json5 里加权限,否则请求会报错(认证必考点!)


{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET",
        "reason": "需要访问网络获取数据",
        "usedScene": {
          "abilities": ["*"],
          "when": "always"
        }
      }
    ]
  }
}
 

步骤 2:GET 请求实战(拉取 JSON 数据)

用免费测试接口 https://jsonplaceholder.typicode.com/users 拉取用户列表,步骤拆解得明明白白:


import http from '@ohos.net.http';

import promptAction from '@ohos.promptAction';

@Entry

@Component

struct HttpGetPage {

@State userList: Array // 存用户列表的状态

build() {

Column() {

Button('发送GET请求拉取用户列表')

.onClick(async () => {

try {

// 1. 创建HTTP客户端实例

const httpClient = http.createHttp();

// 2. 配置请求参数(可选,比如超时时间)

const requestConfig = {

method: http.RequestMethod.GET, // 请求方法

connectTimeout: 60000, // 超时时间60秒

header: {

'Content-Type': 'application/json' // 请求头

}

};

// 3. 发送请求(测试接口:拉取10条用户数据)

const response = await httpClient.request(

'https://jsonplaceholder.typicode.com/users',

requestConfig

);

// 4. 处理响应结果(状态码200表示成功)

if (response.responseCode === 200) {

// 把响应数据(字符串)转成JSON对象

this.userList = JSON.parse(response.result.toString());

promptAction.showToast({ message: `拉取成功!共${this.userList.length}条数据` });

} else {

promptAction.showToast({ message: `请求失败,状态码:${response.responseCode}` });

}

// 5. 销毁客户端(避免内存泄漏,认证考点!)

httpClient.destroy();

} catch (err) {

promptAction.showToast({ message: `请求出错:${err.message}` });

}

})

// 展示拉取到的用户列表

List() {

ForEach(this.userList, (user) => {

ListItem() {

Column() {

Text(`用户名:${user.name}`)

Text(`邮箱:${user.email}`)

Text(`电话:${user.phone}`)

}

.padding(10)

.borderBottom(1, Color.Gray)

}

})

}

.width('100%')

.marginTop(20)

}

.padding(20)

}

}

⚠️ 认证考点标红

  1. 网络权限 ohos.permission.INTERNET 必须配置,否则无法发起请求;
  1. httpClient 用完必须调用 destroy(),否则会导致内存泄漏;
  1. HTTPS 请求无需额外配置证书,鸿蒙默认信任系统根证书;
  1. 响应数据 response.result 是 ArrayBuffer 类型,需用 toString() 转成字符串再解析。

二、POST 请求实战(提交表单 / JSON 数据)

POST 用于提交数据(比如登录、新增数据),咱们分 “提交 JSON” 和 “提交表单” 两种场景讲:

场景 1:提交 JSON 数据


Button('发送POST请求(提交JSON)')

.onClick(async () => {

try {

const httpClient = http.createHttp();

const requestConfig = {

method: http.RequestMethod.POST,

header: {

'Content-Type': 'application/json' // 告诉服务器是JSON格式

},

// 请求体:JSON对象转成字符串

extraData: JSON.stringify({

title: '鸿蒙网络请求实战',

body: '这是用POST提交的JSON数据',

userId: 1

})

};

// 测试接口:提交数据后返回新增的内容

const response = await httpClient.request(

'https://jsonplaceholder.typicode.com/posts',

requestConfig

);

if (response.responseCode === 201) { // 201表示创建成功

const result = JSON.parse(response.result.toString());

promptAction.showToast({ message: `提交成功!新增ID:${result.id}` });

} else {

promptAction.showToast({ message: `提交失败:${response.responseCode}` });

}

httpClient.destroy();

} catch (err) {

promptAction.showToast({ message: `出错:${err.message}` });

}

})

场景 2:提交表单数据(x-www-form-urlencoded)


Button('发送POST请求(提交表单)')

.onClick(async () => {

try {

const httpClient = http.createHttp();

const requestConfig = {

method: http.RequestMethod.POST,

header: {

'Content-Type': 'application/x-www-form-urlencoded' // 表单格式

},

// 表单数据:用&拼接键值对

extraData: 'username=鸿蒙小能手&password=123456&rememberMe=true'

};

// 模拟登录接口(测试用)

const response = await httpClient.request(

'https://jsonplaceholder.typicode.com/posts',

requestConfig

);

if (response.responseCode === 201) {

promptAction.showToast({ message: '表单提交成功!' });

}

httpClient.destroy();

} catch (err) {

promptAction.showToast({ message: `出错:${err.message}` });

}

})

⚠️ 认证考点标红

  1. Content-Type 必须和提交的数据格式匹配:
    • JSON 格式:application/json(需用 JSON.stringify() 转字符串);
    • 表单格式:application/x-www-form-urlencoded(键值对用 & 拼接);
  1. POST 请求的响应状态码:201 表示 “创建成功”,200 表示 “请求成功”(认证会考状态码含义)。

三、数据解析实战:JSON/XML(认证必考)

鸿蒙网络请求返回的数据大多是 JSON(少数 XML),咱们重点讲 JSON 解析,附带 XML 解析方法:

1. JSON 解析(最常用)

上面的例子已经用到了 JSON.parse(),这里讲复杂 JSON 解析(嵌套对象 / 数组):


// 模拟复杂JSON响应数据

const complexJson = `{

"code": 200,

"message": "success",

"data": {

"user": {

"id": 1,

"name": "鸿蒙开发者",

"address": {

"city": "深圳",

"street": "科技园路"

}

},

"hobbies": ["编程", "爬山", "看文档"]

}

}`;

// 解析复杂JSON

Button('解析复杂JSON')

.onClick(() => {

const result = JSON.parse(complexJson);

// 取嵌套对象的属性

const userName = result.data.user.name;

const city = result.data.user.address.city;

const firstHobby = result.data.hobbies[0];

promptAction.showToast({

message: `姓名:${userName},城市:${city},爱好:${firstHobby}`

});

})

2. XML 解析(少用但认证可能考)

需要导入 @ohos.xml.parser 模块,解析 XML 字符串:


import xml from '@ohos.xml.parser';

// 模拟XML响应数据

const xmlData = `

00 <message>success</message>

>

1 </name>

</user>

`;

Button('解析XML数据')

.onClick(async () => {

try {

// 创建XML解析器

const parser = new xml.SaxParser((event) => {

switch (event.eventType) {

case xml.EventType.START_ELEMENT:

console.log(`开始标签:${event.elementName}`);

break;

case xml.EventType.CHARACTERS:

// 取标签内的文本内容

if (event.elementName === 'name') {

promptAction.showToast({ message: `XML解析结果:${event.text}` });

}

break;

case xml.EventType.END_ELEMENT:

console.log(`结束标签:${event.elementName}`);

break;

}

});

// 开始解析

await parser.parseString(xmlData);

} catch (err) {

promptAction.showToast({ message: `XML解析出错:${err.message}` });

}

})

⚠️ 认证考点标红

  1. JSON 解析核心:JSON.parse()(字符串→JSON 对象)、JSON.stringify()(JSON 对象→字符串);
  1. XML 解析需用 SaxParser,通过监听事件(START_ELEMENT/CHARACTERS/END_ELEMENT)获取数据;
  1. 解析嵌套 JSON 时,要注意空值判断(比如 result?.data?.user?.name,避免报错)。

四、网络请求进阶:拦截器 + 错误处理(实战必备)

实际开发中需要统一处理请求头、Token、错误,这里给一套可复用的工具类:

步骤 1:封装网络请求工具类


// utils/HttpUtil.ets

import http from '@ohos.net.http';

import promptAction from '@ohos.promptAction';

// 基础URL(实际项目中可配置不同环境)

const BASE_URL = 'https://jsonplaceholder.typicode.com';

// 封装请求方法

export class HttpUtil {

// 通用请求方法

static async request(url: string, method: http.RequestMethod, data?: any, header?: any) {

try {

const httpClient = http.createHttp();

// 统一配置请求头(比如添加Token)

const defaultHeader = {

'Content-Type': 'application/json',

'Authorization': 'Bearer ' + '你的Token' // 实际项目中从Preferences读取

};

const requestConfig = {

method,

header: { ...defaultHeader, ...header }, // 合并默认头和自定义头

extraData: data ? JSON.stringify(data) : ''

};

// 拼接完整URL

const fullUrl = BASE_URL + url;

const response = await httpClient.request(fullUrl, requestConfig);

// 统一处理响应

if (response.responseCode === 200 || response.responseCode === 201) {

return JSON.parse(response.result.toString());

} else if (response.responseCode === 401) {

promptAction.showToast({ message: 'Token过期,请重新登录' });

// 跳转到登录页(实际项目中实现)

} else {

promptAction.showToast({ message: `请求失败:${response.responseCode}` });

return null;

}

} catch (err) {

promptAction.showToast({ message: `网络错误:${err.message}` });

return null;

}

}

// GET请求快捷方法

static get(url: string, header?: any) {

return this.request(url, http.RequestMethod.GET, null, header);

}

// POST请求快捷方法

static post(url: string, data?: any, header?: any) {

return this.request(url, http.RequestMethod.POST, data, header);

}

}

步骤 2:使用封装后的工具类


// 导入工具类

import { HttpUtil } from '../utils/HttpUtil';

Button('用工具类发送GET请求')

.onClick(async () => {

// 直接调用封装好的get方法,无需重复写配置

const result = await HttpUtil.get('/users');

if (result) {

this.userList = result;

promptAction.showToast({ message: `拉取成功!共${this.userList.length}条数据` });

}

})

Button('用工具类发送POST请求')

.onClick(async () => {

const data = { title: '封装工具类测试', body: '真方便!', userId: 1 };

const result = await HttpUtil.post('/posts', data);

if (result) {

promptAction.showToast({ message: `新增成功,ID:${result.id}` });

}

})

⚠️ 认证考点标红

  1. 实际开发中建议封装网络工具类,统一处理请求头、Token、错误;
  1. Token 通常存储在 Preferences 中,请求时从本地读取(认证会考 “Token 存储 + 网络请求结合”);
  1. 常见错误码含义(认证必背):
    • 401:未授权(Token 过期 / 无效);
    • 404:接口不存在;
    • 500:服务器内部错误;
    • 403:权限不足。

五、三种存储方式对比(认证必背)

网络请求方式

适用场景

核心 API / 方法

认证考点频次

GET

拉取数据(查询、列表)

http.RequestMethod.GET、JSON.parse()

必考

POST

提交数据(新增、登录)

http.RequestMethod.POST、extraData

必考

工具类封装

实际项目开发(统一管理)

封装request方法、统一处理响应

高频

XML 解析

兼容旧系统接口

xml.SaxParser、事件监听

常考


六、班级

目前班级正火热招募学员!加入班级:https://developer.huawei.com/consumer/cn/training/classDetail/6b5617ffd9264d6daa2f3d9250204f1e?type=1%3Fha_source%3Dhmosclass&ha_sourceId=89000248,跟着系列文章系统学,快速掌握鸿蒙开发核心技能,冲刺 HarmonyOS 应用开发者认证!无论你是零基础入门,还是在职开发者提升,都能在班级中收获成长,抢占鸿蒙生态人才红利~
 

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐