欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

各位小伙伴,我是Moranbika!经过DAY2的奋战,我们已经有了一个能在多终端跑起来的“架子”应用。今天,我们要给它注入灵魂,让它能从互联网上获取鲜活的数据并展示出来。这就是DAY3的核心任务:为开源鸿蒙跨平台工程集成网络请求能力,构建一个动态的数据清单列表

听起来是不是比单纯搭环境更有意思了?但这一步的“坑”也同样经典:权限声明了为啥没效果?请求为什么发不出去?数据拿到了却渲染白屏?别担心,我会把我趟过的雷、填平的坑,毫无保留地分享给你。这篇文章,咱们就专注解决这三个核心问题。

第一部分:出发前的“通行证”——网络权限配置

想让你的应用访问网络,第一步不是写请求代码,而是向系统郑重声明:“我需要上网权限”。这一步没做或做错,后面所有努力都是白费。

1. 找到正确的配置文件
权限声明不在Java或JavaScript代码里,而是在一个固定的配置文件中。用DevEco Studio打开你的工程,找到这个文件:
entry -> src -> main -> module.json5

2. 写入权限声明代码
在这个文件里,找到 "module" 这个大对象。我们需要在它内部添加一个 requestPermissions 字段。位置很重要,我给出一个清晰的上下文示例:

json

{
  "module": {
    // ... 其他已有的配置,比如name、type等 ...
    "abilities": [...],
    // 关键:在合适的位置(通常放在abilities之后)添加requestPermissions
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ]
  }
}

3. 第一个坑:声明了权限,开发板上依然网络失败
在真机和模拟器上,只配置上述权限通常就够了。但当我们兴致勃勃地把应用装到DAYU200这类开发板上时,控制台可能会无情地抛出一个错误:Network is unreachable

问题根源:开发板出于安全考虑,其系统镜像可能默认禁止应用访问非加密的HTTP链接,或者对网络访问有更严格的沙盒限制。

我的排查与解决方案

  • 第一步,确认基础连接:通过开发板的命令行,尝试 ping 一个公网地址(如 ping 8.8.8.8)。如果不通,说明是开发板本身的网络配置问题,需要检查网线、Wi-Fi或路由设置。

  • 第二步,检查API地址:如果你的测试接口是 http 开头的(非加密),在开发板上很可能会被拦截。最佳实践是始终使用 https 接口进行测试

  • 第三步,处理HTTPS仍失败:如果已经是 https 仍失败,可能是开发板系统缺失根证书。一个临时的解决办法(仅限开发测试阶段!)是在创建HTTP客户端时,配置其信任所有证书。注意:此方法存在安全风险,绝对不可用于生产环境。

第二部分:挥出第一剑——使用原生HTTP API获取数据

权限通了,我们开始写核心业务代码。OpenHarmony提供了原生的 @ohos.net.http 模块,功能强大,是我们首先要掌握的武器。

1. 代码实现与解析
假设我们要从一个公开的测试API(https://jsonplaceholder.typicode.com/posts)获取文章列表。我们在页面的 aboutToAppear 生命周期或按钮点击事件中发起请求。

下面是一段详细的、带有完整错误处理的示例代码,你可以直接放在你的页面 .ets 文件里:

javascript

// 1. 导入HTTP模块
import http from '@ohos.net.http';

// 2. 定义存储数据的变量,使用@State装饰器使其变化能驱动UI更新
@State postList: Array<any> = [];

// 3. 定义发起请求的方法
fetchData() {
  // 创建一个HTTP请求客户端
  let httpRequest = http.createHttp();

  // 定义请求的URL
  let url = 'https://jsonplaceholder.typicode.com/posts';

  // 发起GET请求
  httpRequest.request(
    url,
    {
      method: http.RequestMethod.GET, // 请求方法
      connectTimeout: 60000, // 连接超时时间(毫秒)
      readTimeout: 60000,    // 读取超时时间(毫秒)
    },
    (err, data) => {
      // 请求结束后的回调函数
      if (err) {
        // 错误处理:详细记录日志,更新UI状态
        console.error('网络请求失败,错误码:', err.code, '错误信息:', err.message);
        // 这里可以触发一个UI状态,显示“加载失败”
        return;
      }

      // 请求成功,解析数据
      console.info('请求成功,状态码:', data.responseCode);
      console.info('返回数据:', data.result);

      try {
        // 将返回的字符串数据解析为JSON对象
        let parsedData = JSON.parse(data.result as string);
        // 更新状态变量,UI会自动重新渲染
        this.postList = parsedData;
      } catch (parseError) {
        console.error('数据解析失败:', parseError);
        // 处理数据解析异常
      }

      // 使用完毕后,关闭连接以释放资源
      httpRequest.destroy();
    }
  );
}

2. 第二个坑:数据拿到了,列表却是白花花一片
这是新手最高频遇到的问题。控制台明明打印 parsedData 有数据,但页面上的 List 组件什么也不显示。

问题根源与解决方案

  • 检查点A:List组件的数据绑定。确保你的List组件正确绑定了 this.postList

    javascript
    
    List() {
      ForEach(this.postList, (item: any) => {
        ListItem() {
          // 你的列表项UI,确保能访问到item的属性,如item.title
          Text(item?.title).fontSize(16) // 使用可选链操作符防止undefined报错
        }
      }, (item: any) => item.id.toString()) // 必须提供唯一的键值,如id
    }
  • 检查点B:数据格式与UI预期不符。API返回的数据结构可能是 { data: [...] },而你直接把它赋值给了 postList。你需要的是 parsedData.data。一定要用 console.log 把 parsedData 的结构打出来看清楚。

  • 检查点C:UI线程更新。确保网络请求的回调中更新 @State 变量的操作是在UI线程中执行的。上述原生API的回调通常已自动处理,但如果遇到问题,可以用 runOnUIThread 方法包裹更新操作。

第三部分:升级装备——集成三方库axios(更优雅的选择)

原生API虽然强大,但如果你熟悉Web开发,可能会怀念 axios 这种链式调用的优雅。好消息是,社区已经有了适配OpenHarmony的 axios 库。

1. 安装与引入
在你的项目根目录(包含 package.json 的目录)打开终端,执行安装命令:

bash

npm install @ohos/axios

安装完成后,在页面文件中引入:

javascript

import axios from '@ohos/axios';

2. 使用axios重构请求
使用 axios 后,之前的请求代码可以写得更加简洁:

javascript

async fetchDataWithAxios() {
  try {
    let url = 'https://jsonplaceholder.typicode.com/posts';
    // 发起GET请求
    let response = await axios.get(url);
    // axios已经帮我们自动将响应数据解析为JSON了
    console.info('请求成功,数据:', response.data);
    this.postList = response.data;
  } catch (error) {
    // axios将错误统一封装,可以在这里进行更精细的错误处理
    console.error('请求失败:', error.message);
    if (error.response) {
      console.error('错误状态码:', error.response.status);
    }
  }
}

3. 第三个坑:引入axios后,工程编译报错或运行崩溃
这通常是三方库兼容性问题的典型表现。

常见原因与解决方案

  • 原因A:npm包版本与鸿蒙SDK不兼容。确保你安装的是针对OpenHarmony的特定版本(@ohos/axios),而不是普通的 axios

  • 原因B:Native模块桥接失败。某些三方库依赖原生(C++)模块。如果库的文档没有明确说明支持OpenHarmony,在开发板上可能无法工作。解决方案是查看该库在Gitee的OpenHarmony三方库仓库中是否有兼容性说明,或寻找替代库。

  • 原因C:包管理混乱。在安装新的三方库后,最好删除 node_modules 和 harmony/.cache 目录,然后重新执行 npm install 和 DevEco Studio的 Sync 操作,进行一次干净的构建。

第四部分:提交与复盘——固化你的成果

功能实现后,别忘了DAY2的好习惯:将代码规范化地提交到AtomGit。

bash

# 添加所有变更文件
git add .

# 进行一次清晰的提交
git commit -m "feat: 集成网络请求与动态列表功能

- 在module.json5中声明ohos.permission.INTERNET网络权限
- 使用@ohos.net.http原生API实现GET请求,并处理超时与解析异常
- 完成列表数据绑定与渲染,解决数据获取后UI不更新的问题
- 可选:集成并测试@ohos/axios三方库,对比两种实现方式
- 记录开发板网络访问的特殊性及解决方案"

# 推送到远程仓库
git push origin main

DAY3 总结与心法

完成DAY3,你的应用已经从静态的“标本”变成了动态的“活物”。我们不仅学会了:

  1. 声明权限的规范:知道配置该写在哪,以及开发板与真机的环境差异。

  2. 两种网络请求方式:掌握原生 http 模块的详细配置和错误处理,以及用 axios 提升开发效率。

  3. 数据驱动UI的核心:深刻理解 @State 响应式变量与 ListForEach 的配合,解决了“有数据无界面”的经典问题。

更重要的是,我们建立了 “请求-响应-处理-渲染” 的完整前端数据流思维。这个过程里遇到的每一个报错,都是系统在教你理解它的运行规则。

在DAY4-DAY6,我们将为这个动态列表添加“左膀右臂”:上拉加载更多和下拉刷新,让它成为一个体验完整的现代应用列表。我们下次见!

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐